详解记录Java Log的几种方式

在Java中记录日志的方式有如下几种:

一、System.out.println(最简单)

1、输出到控制台:System.out.println("XXX");
2、输出到指定文件:

import java.io.PrintStream;

PrintStream ps = new PrintStream("D:\\test.txt");
System.setOut(ps);
System.out.println("XXX");

二、java.util.logging(相对简单)

JDK自带的logging.jar中的方法。通过位于JDK安装路径下的jre/lib/logging.properties文件进行配置。

1、默认配置如下:

handlers= java.util.logging.ConsoleHandler

.level= INFO

# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

默认是输出到控制台,如果既想在控制台,又想在文件中,要修改如下配置:

handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler

Logger的级别按降序排序如下:

  • SEVERE(最高值)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST(最低值)

默认所有log的输出级别是INFO(.level= INFO),比INFO更低的日志不会显示。
控制台的Log输出级别可以特殊控制,默认也是INFO,可以修改如下配置:

java.util.logging.ConsoleHandler.level = INFO

2、实例

(1)输出到控制台:

Logger log = Logger.getLogger("testLog");
log.setLevel(Level.WARNING);
log.warning("xxxx testLog warning");

输出结果:

(2)输出到文件:

FileHandler fileHandler;//文件控制器
try {
    fileHandler = new FileHandler("D:\\temp\\text.log");
	fileHandler.setLevel(Level.INFO);
	fileHandler.setFormatter(new Formatter() {//定义一个匿名类
         //Formatter 接受 LogRecord,并将它转换为一个字符串。
         @Override
         public String format(LogRecord record) {

             Date date = new Date();
             String sDate = date.toString();
             return "[" + sDate + "]" + "[" + record.getLevel() + "]" + ":" +  record.getMessage() + "\n";
         }
    });

	Logger log = Logger.getLogger("testLog");
	log.addHandler(fileHandler);
	log.info("aaa");
} catch (SecurityException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

默认状况下, 日志会打印到控制台。添加 filehandler 后, 会同时写入文件。输出结果:


三、log4j(最强大)

可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。具体配置不在此处详述。

1、Log4J的输出级别按降序排序如下:

  • OFF             最高等级,关闭日志
  • FATAL          可能导致应用中止的严重事件错误
  • ERROR       严重错误,主要是程序错误
  • WARN         一般警告
  • INFO           一般显示信息
  • DEBUG       调试信息
  • TRACE        比DEBUG更细粒度的事件信息
  • ALL              最低等级

2、实例

import org.apache.log4j.Logger;
public class Log4jTest {

    private static Logger log = Logger.getLogger(Log4jTest.class);
    public void log() {
        log.info("hello this is log4j info log");
    }

    public static void main(String[] args) {
        Log4jTest test = new Log4jTest();
        test.log();
    }
}

除了上述几种,还存在logback等其他的日志框架,对于开发者而言,每种日志都有不同的写法。如果以实际的日志框架来进行编写,之后更换日志系统就很麻烦。

由此诞生了以下的门面类日志框架(它们都不是日志的最终实现,只是一套规范),将系统和具体的日志实现框架解耦合。

四、commons-logging(全称:Jakarta Commons Logging

commons-logging是为那些需要建立在不同环境下使用不同日志架构的组件或库的开发者创建的,由commons-logging在运行时决定使用哪种日志架构。

默认的LogFactory是按照下列的步骤去发现并决定那个日志工具将被使用的(按照顺序,寻找过程会在找到第一个工具时中止):

  • 首先在classpath下寻找自己的配置文件commons-logging.properties,使用其中定义的Log实现类;
  • 找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,使用其定义的Log实现类;
  • 否则,查看classpath中是否有Log4j的包,有则自动使用Log4j作为日志实现类;
  • 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
  • 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;

在common-logging.properties文件中设置实现Log接口的类:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

commons-logging结合Log4J的实例

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class JCLTest {

    private static Log log = LogFactory.getLog(JCLTest.class);
    public void log() {

       log.info("hello this is JCL info log");
    }

    public static void main(String[] args) {
       JCLTest test = new JCLTest();
       test.log();
    }
}

五、slf4j(全称:Simple Logging Facade for Java,简单日志门面

SLF4j+Log4j 与 JCL+Log4J 的使用方式差不多,主要差异就在 SLF4J 用 jar 来告知用哪种日志实现,而 JCL 是通过配置文件来获得该选择哪个日志实现。

实例

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {

    private static final Logger log = LoggerFactory.getLogger(Test.class);
    public void test() {
        log.info("hello this is {} info log", "SLF4J");
    }
}

到此这篇关于详解记录Java Log的几种方式的文章就介绍到这了,更多相关Java Log内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java项目打包成可执行jar用log4j将日志写在jar所在目录操作

    开发一个demo时想将日志输出到最终打包的jar所在目录,从网上学习实验整理之后的配置如下, log4j.properties log4j.rootLogger = INFO,console,logFile log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Threshold=INFO log4j.appender.console.ImmediateFlush=true log4j.app

  • Java日志软件Log4j的基本使用教程

    1.概述 1.1背景 在我们的日常开发中,日志记录非常重要.在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作:跟踪代码运行时轨迹,作为日后审计的依据:担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息. 1.2简介 Log4j(log for java)是Apache的一个开放源代码项目,它提供了一种细腻的日志管理方式.通过一个配置文件,我们可以多选择的控制每条日志的输出格式和目的地.通过定义信息的级别,我们也

  • Java 配置log4j日志文件路径 (附-获取当前类路径的多种操作)

    1 日志路径带来的痛点 Java 项目中少不了要和log4j等日志框架打交道, 开发环境和生产环境下日志文件的输出路径总是不一致, 设置为绝对路径的方式缺少了灵活性, 每次变更项目路径都要修改文件, 目前想到的最佳实现方式是: 根据项目位置自动加载并配置文件路径. 本文借鉴 Tomcat 的配置方式 "${catalina.home}/logs/catalina.out", 通过相对路径的方式设置日志的输出路径, 有其他解决方案的小伙伴, 请直接评论区交流哦

  • elasticsearch+logstash并使用java代码实现日志检索

    为了项目日志不被泄露,数据展示不采用Kibana 1.环境准备 1.1 创建普通用户 #创建用户 useradd querylog #设置密码 passwd queylog #授权sudo权限 查找sudoers文件位置 whereis sudoers #修改文件为可编辑 chmod -v u+w /etc/sudoers #编辑文件 vi /etc/sudoers #收回权限 chmod -v u-w /etc/sudoers #第一次使用sudo会有提示 We trust you have

  • Java日志框架之logback使用详解

    为什么使用logback 记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结一下,logback大约有以下的一些优点: 内核重写.测试充分.初始化内存加载更小,这一切让logback性能和log4j相比有诸多倍的提升 logback非常自然地直接实现了slf4j,这个严格来说算不上优点,只是这样,再理解slf4j的前提下会很容易理解logback,也同时很容易用其他日志框架

  • Java中 log4j日志级别配置详解

    1.1 前言 说出来真是丢脸,最近被公司派到客户公司面试外包开发岗位,本来准备了什么redis.rabbitMQ.SSM框架的相关面试题以及自己做过的一些项目回顾,信心满满地去面试,结果别人一上来就问到了最近项目使用的日志系统是什么?日志级别是怎么配置的?当时我都蒙X了,平时都是项目经理搭的,我自己也是随便上网一搜往配置文件一黏贴就OK了.我就这么说完后面试官深深定了我一眼,当时我的内心羞愧到...... 1.2 闲话少说,讲讲日志的发展故事(如果已经了解的可以跳过,直接看1.3日志配置) 要想

  • Log4j定时打印日志及添加模块名配置的Java代码实例

    配置间隔时间,定时打印日志  接到个需求,通过log4j定时打印日志,需求描述如下:需要能够定时打印日志,时间间隔可配.说到定时,首先想到了DailyRollingFileAppender类,各种定时,根据datePattern,这个可以参考类SimpleDateFormat类,常见的一些定时设置如下: '.'yyyy-MM: 每月 '.'yyyy-ww: 每周 '.'yyyy-MM-dd: 每天 '.'yyyy-MM-dd-a: 每天两次 '.'yyyy-MM-dd-HH: 每小时 '.'yy

  • java自定义日志输出文件(log4j日志文件输出多个自定义日志文件)

    log4j输出多个自定义日志文件 如果在实际应用中需要输出独立的日志文件,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢? 先看一个常见的log4j.properties文件,它是在控制台和test.log文件中记录日志: 复制代码 代码如下: log4j.rootLogger=DEBUG, stdout, logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layo

  • Java logback日志的简单使用

    说明 logback作为log4j的替代,有很多优势.要将logback应用到项目中,步骤很简单.加入依赖的jar包和配置文件即可. logback.xml中主要元素: <property> 定义属性,定义之后,后文可以通过该变量引用. <appender> 定义日志输出格式.位置.文件分割等.被<logger>或<root>引用. <logger> 定义日志名称及对应的级别.name可以是包名.类名或者单纯的字符串.如果是包名或者类名,那么该包

  • 在Java下利用log4j记录日志的方法

    1.前言 log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布. Log4j已经被移植到了C,C++,C#,Perl,Python和Ruby等语言中. Log4j是高度可配置的,并可通过在运行时的外部文件配置.它根据记录的优先级别,并提供机制,以指示记录信息到许多的目的地,例如:数据库,文件,控制台,UNIX系统日志等. Log4j中有三个主要组成部分: loggers: 负责捕获记录信息. appenders : 负责发布日志信息,以不同的首选目

随机推荐