Logger日志使用教程

Java util Logger的使用步骤

Java util Logger是java原生的日志生成工具,不需要另外引用类库,使用方便,学习简单,能够在小型应用中灵活使用。下面从实际应用角度,对Logger的使用步骤作出总结,以实现快速掌握。

Logger的使用一般包括以下几个步骤:

一、 定义全局的Logger,在不同的类中共用

关键语句

 Logger myLogger = Logger.getLogger("com.mycompany.myapp");

方法参数是Logger的名称,当名称相同时候,同一个名称的Logger只创建一个,实现各个类中共享。

二、 Logger设置输出等级,并输出日志

在进行信息的记录时,依信息程序的不同,会设定不同等级的信息输出。Java log比log4j的级别详细,全部定义在java.util.logging.Level里面。

各级别按降序排列如下:

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

此外,还有一个级别OFF,可用来关闭日志记录,使用级别ALL启用所有消息的日志记录。

logger默认的级别是INFO,比INFO更低的日志将不显示。

Logger的默认级别定义是在jre安装目录的lib下面。

public class LoggingDemo {
    public static void main(String[] args){
        Logger logger = Logger.getLogger("LoggingDemo");

        logger.severe("严重信息");

        logger.warning("警示信息");

        logger.info("一般信息");

        logger.config("设定方面的信息");

        logger.fine("细微的信息");

        logger.finer("更细微的信息");

        logger.finest("最细微的信息");
    }

}

执行结果:

在这里插入图片描述

三、 设定输出媒介控制器(Handler)

共有四步:

  1. 一般日志输出包括调试时输出到控制台,以及程序运行时输出到文件,因此Handler包括了控制台ConsoleHandler以及文件FileHandler
  2. Handler输出的日志格式为默认格式,系统提供的格式包括SimpleFormatterXMLFormatter等,输出的内容一般比较冗余,不满足使用,最好使用自定义内容输出格式,可使用派生自Formatter类的自定义子类。
  3. 设定Handler的输出等级,默认是info级。
  4. Handler加入到Logger中。

关键语句

  //创建consoleHandler 自定义类实例,用于在控制台发送日志
  ConsoleHandler consoleHandler = new ConsoleHandler();
  //设置consoleHandler实例输出格式
  consoleHandler.setFormatter(new ConsoleLogFormatter());
  //加入到Logger中
  myLogger.addHandler(consoleHandler);
  //不显示系统自带的consoleHandler,否则控制台将发出两条同样的日志
  myLogger.setUseParentHandlers(false);
    
  //在工程目录下创建log文件夹
  File dir = new File("log");
  if(!dir.exists() || !dir.isDirectory())
  dir.mkdir();

  //创建fileHandler 自定义类实例,用于在文件保存日志  
  FileHandler fileHandler = new         
  FileHandler("log\\myapp.%u.%g.txt",1000,2,true);
  fileHandler.setFormatter(new FileLogFormatter());
  fileHandler.setLevel(Level.INFO);
  myLogger.addHandler(fileHandler);

说明 :

  • 创建日志文件前,若没有文件夹,log将会报错,因此在写入日志文件前,检查文件夹是否存在,不存在则创建文件夹。
  • FileHandler fileHandler = new FileHandler(“log\myapp.%u.%g.txt”,1000,2,true);
    语句意义为:新建FileHandler,地址为工程文件路径下;log\myapp.%u.%g.txt,循环文件编号为**%u.%g**,文件最大1000字节,2个文件循环,是否追加文件为“是”,否则总为新建文件。
  • myLogger.setUseParentHandlers(false);
    语句意义为:系统自带的consoleHandler设置为不生效,仅生效增加的自定义consoleHandler,否则控制台将发出两条同样的日志。

关键语句

    //设置输出的等级
    myLogger.setLevel(Level.INFO);
    myLogger.info("一般信息1 ");
    myLogger.info("一般信息2 ");

完整的程序代码为:

public class LogProduce {

    public static void main(String[] args) throws IOException {

        Logger myLogger = Logger.getLogger("com.mycompany.myapp");

        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setFormatter(new ConsoleLogFormatter());
        myLogger.addHandler(consoleHandler);
        myLogger.setUseParentHandlers(false);

        File dir = new File("log");
        if(!dir.exists() || !dir.isDirectory())
            dir.mkdir();

        FileHandler fileHandler = new FileHandler("log\\myapp.%u.%g.txt",1000,2,true);
        fileHandler.setFormatter(new FileLogFormatter());
        fileHandler.setLevel(Level.INFO);
        myLogger.addHandler(fileHandler);

        myLogger.setLevel(Level.INFO);
        myLogger.info("一般信息1 ");
        myLogger.info("一般信息2 ");

        LogUser logUser1 = new LogUser();
        logUser1.produceLog();
    }
}

实际输出为;
Console输出:

在这里插入图片描述

文件输出:

在这里插入图片描述

四、补充说明
  1. ConsoleLogFormatterFileLogFormatter 两个派生的 Formatter 子类
public class FileLogFormatter extends Formatter {

    public FileLogFormatter(){
        super();
    }

    @Override
    public String format(LogRecord r) {
        Date date = new Date();
        String sDate = date.toString();
        String lineSperator = System.getProperty("line.separator");

        StringBuilder sb = new StringBuilder();
        sb.append("[" + sDate + "]" + "[" + r.getLevel() +"]");
        sb.append(r.getMessage());
        //在一条日志结束后采用常量方式的系统换行符,因为 “\n” 形式可能不识别 
        sb.append(lineSperator);

        return sb.toString();
    }
}

该子类重写了format方法,用于用户自定义输出,使用StringBuilder类拼装。
关键语句

String lineSperator = System.getProperty("line.separator");

若直接在格式字符串中插入传统换行符“\n",在输出文件中可能不能识别,因此采用系统定义的换行符 line.separator
类似的,ConsoleLogFormatter代码为:

public class ConsoleLogFormatter extends Formatter {

    public ConsoleLogFormatter(){
        super();
    }

    @Override
    public String format(LogRecord r) {

        String lineSperator = System.getProperty("line.separator");

        StringBuilder sb = new StringBuilder();
        sb.append(r.getMessage());
        sb.append(lineSperator);

        return sb.toString();

    }
}
  1. 子类中调用Logger
    在子类中调用getLogger即可。
public class LogUser {

    Logger myLogger = Logger.getLogger("com.mycompany.myapp");

    public void produceLog(){

        myLogger.info("LogUser.produceLog");
    }
}

Log4j日志文件配置

日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。在apache网站:jakarta.apache.org/log4j 可以免费下载到Log4j最新版本的软件包。

一、入门实例

1.新建一个JAva工程,导入包log4j-1.2.17.jar,整个工程最终目录如下

在这里插入图片描述

2、src同级创建并设置log4j.properties

### 设置###
log4j.rootLogger = debug,stdout,D,E
 
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
 
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
 
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

3、设置日志内容


package com.xkp;
import org.apache.log4j.Logger;
/**
 *@author 付军
 *@2020年5月18日9:14:21
 */
public class Test {
	private static Logger logger = Logger.getLogger(Test.class);  
 
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        // System.out.println("This is println message.");  
 
        // 记录debug级别的信息  
        logger.debug("This is debug message.");  
        // 记录info级别的信息  
        logger.info("This is info message.");  
        // 记录error级别的信息  
        logger.error("This is error message.");  
    }  
 
}

4、输出结果

(1)首先是控制台的信息

在这里插入图片描述

(2)再来看输出的文件

在这里插入图片描述

发现已按照要求输出到对应的文档中去了。

二、Log4j基本使用方法

Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显 示内容。

2.1、定义配置文件

其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)。下面我们介绍使用Java特性文件做为配置文件的方法:
1.配置根Logger,其语法为:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指B日志信息输出到哪个地方。您可以同时指定多个输出目的地。

2.配置日志信息输出目的地Appender,其语法为:

log4j.appender.appenderName = fully.qualified.name.of.appender.class  
log4j.appender.appenderName.option1 = value1  
…  
log4j.appender.appenderName.option = valueN

其中,Log4j提供的appender有以下几种:

org.apache.log4j.ConsoleAppender(控制台),  
org.apache.log4j.FileAppender(文件),  
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),  
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),  
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

3.配置日志信息的格式(布局),其语法为:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class  
log4j.appender.appenderName.layout.option1 = value1  
…  
log4j.appender.appenderName.layout.option = valueN

其中,Log4j提供的layout有以e几种:

org.apache.log4j.HTMLLayout(以HTML表格形式布局),  
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),  
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),  
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL  
%r 输出自应用启动到输出该log信息耗费的毫秒数  
%c 输出所属的类目,通常就是所在类的全名  
%t 输出产生该日志事件的线程名 
%m 输出产生该日志事件的日志信息message
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”  
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921  
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

2.2、在代码中使用Log4j

1.得到记录器

使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:

public static Logger getLogger( String name)

通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:

static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

2.读取配置文件

当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:

BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。  
PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。  
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。

3.插入记录信息(格式化日志信息)

当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:

Logger.debug ( Object message ) ;  
Logger.info ( Object message ) ;  
Logger.warn ( Object message ) ;  
Logger.error ( Object message ) ;

2.3、日志级别

每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:
A:off 最高等级,用于关闭所有日志记录。
B:fatal 指出每个严重的错误事件将会导致应用程序的退出。
C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
D:warm 表明会出现潜在的错误情形。
E:info 一般和在粗粒度级别上,强调应用程序的运行全程。
F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
G:all 最低等级,用于打开所有日志记录。

上面这些级别是定义在org.apache.log4j.Level类中。Log4j只建议使用4个级别,优先级从高到低分别是error,warn,info和debug。通过使用日志级别,可以控制应用程序中相应级别日志信息的输出。例如,如果使用b了info级别,则应用程序中所有低于info级别的日志信息(如debug)将不会被打印出来。

slf4j

我们为什么要使用slf4j

我们为什么要使用slf4j,举个例子:

我们自己的系统中使用了logback这个日志系统
我们的系统使用了A.jar,A.jar中使用的日志系统为log4j
我们的系统又使用了B.jar,B.jar中使用的日志系统为slf4j-simple

这样,我们的系统就不得不同时支持并维护logback、log4j、slf4j-simple三种日志框架,非常不便。

解决这个问题的方式就是引入一个适配层,由适配层决定使用哪一种日志系统,而调用端只需要做的事情就是打印日志而不需要关心如何打印日志,slf4j或者commons-logging就是这种适配层,slf4j是本文研究的对象。

从上面的描述,我们必须清楚地知道一点:slf4j只是一个日志标准,并不是日志系统的具体实现。理解这句话非常重要,slf4j只做两件事情:

  • 提供日志接口
  • 提供获取具体日志对象的方法

slf4j-simple、logback都是slf4j的具体实现,log4j并不直接实现slf4j,但是有专门的一层桥接slf4j-log4j12来实现slf4j。

为了更理解slf4j,我们先看例子,再读源码,相信读者朋友会对slf4j有更深刻的认识。

基本输出效果

jar包的依赖

slf4j-api-1.7.7.jar
slf4j-log4j12-1.7.7.jar

log4j.properties的配置文件

# 日记级别(单个级别) 文件/控制台
log4j.rootLogger=debug, stdout,file

# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Rirect log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=test.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

Log4jTest.java


public class Log4jTest {

        private static final Logger logger = LoggerFactory.getLogger(Log4jTest.class);

        public static void main(String[] args) {
            logger.debug("debug");
            logger.warn("warm");
            logger.error("error");
        }
 }

控制台打印的信息如下:

在这里插入图片描述

控制台打印的信息

带参数的输出效果

package com.xkp.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jTest {
    private static Logger logger = LoggerFactory.getLogger(Slf4jTest.class);// slf4j日志记录器
    public static void main(String[] args) {
        // 普通的日志记录
        logger.debug("普通的日志记录");
        // {}占位符记录日志
        for (int i = 0; i < 3; i++) {
            logger.debug("这是第{}条记录", i);
        }
        // 用\转义{}
        logger.debug("Set \\{} differs from {}", "3"); // output:Set {} differs
                                                        // from 3
        // 两个参数
        logger.debug("两个占位符,可以传两个参数{}----{}", 1, 2);
        // 多个参数(可变参数)
        logger.debug("debug:多个占位符,{},{},{},{}", 1, 2, 3, 4);
        // 多个参数(可变参数)
        logger.info("info:多个占位符,{},{},{},{}", 1, 2, 3, 4);
        // 多个参数(可变参数)
        logger.error("error:多个占位符,{},{},{},{}", 1, 2, 3, 4);

    }

}

将日志文件写入数据库

在上面项目的基础上加上连接数据库的jar包

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.18</version>
</dependency>

log4j.xml的配置文件中添加将日志文件插入数据库的配置,同时需要将第一行配置文件改为:

# 日记级别(单个级别) 文件/控制台
log4j.rootLogger=debug, stdout,file,datasource
#下面是配置将日志信息插入数据库,
#配置输出目标为数据库(假如要将日志在控制台输出,配置为log4j.appender. stdout =org.apache.log4j.ConsoleAppender;将日志写入文件,配置为log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
#这样的配置在许多地方都要有,需要可查有关资料),当然你也可以自己扩展org.apache.log4j.jdbc.JDBCAppender这个类,只需要在这里配置就可以了例如我们配置我自己扩展的MyJDBCAppender,配置为#log4j.appender.db=com.neam.commons.MyJDBCAppender
log4j.appender.datasource=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.datasource.layout=org.apache.log4j.PatternLayout
log4j.appender.datasource.driver=com.mysql.jdbc.Driver
#定义什么级别的错误将写入到数据库中
log4j.appender.datasource.BufferSize=1
#设置缓存大小,就是当有1条日志信息是才忘数据库插一次,我设置的数据库名和表名均为user
log4j.appender.datasource.URL=jdbc\:mysql\://localhost\:3306/user?characterEncoding\=UTF8&zeroDateTimeBehavior\=convertToNull
log4j.appender.datasource.user=root
log4j.appender.datasource.password=root
log4j.appender.datasource.sql=insert into user (class,method,create_time,log_level,log_line,msg) values ('%C','%M','%d{yyyy-MM-dd HH:mm:ss}','%p','%l','%m')
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},SSS为毫秒数(也可以写为SS,只不过SSS如果不足三位会补0),输出类似:2011-10-18 22:10:28,021
%r: 输出自应用启动到输出该日志耗费的毫秒数
%t: 输出产生日志的线程名称
%l: 输出日志事件的位置,相当于%c.%M(%F:L)的组合,包括类全名、方法、文件名以及在代码中行数。例如:cn.xm.test.PlainTest.main(PlanTest.java:12)
%c: 输出日志信息所属的类目,通常就是所在类的全名。可写为%c{num},表示取完整类名的层数,从后向前取,比如%c{2}取 "cn.qlq.exam"类为"qlq.exam"。
%M: 输出产生日志信息的方法名%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中 
%%: 输出一个"%"字符 
%F: 输出日志消息产生时所在的文件名称 
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息 
%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行

在这里插入图片描述

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当涉及到记录和追踪代码执行过程中的信息时,logger是一个非常有用的工具。在Python中,我们可以使用内置的logging模块来创建和配置logger。 下面是一个简单的logger教程,包括创建logger对象、设置日志级别、添加处理程序和格式化日志消息: ```python import logging # 创建logger对象 logger = logging.getLogger('my_logger') # 设置日志级别 logger.setLevel(logging.DEBUG) # 创建文件处理程序 file_handler = logging.FileHandler('log.txt') # 创建控制台处理程序 console_handler = logging.StreamHandler() # 创建日志消息格式化器 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 将格式化器添加到处理程序 file_handler.setFormatter(formatter) console_handler.setFormatter(formatter) # 将处理程序添加到logger对象 logger.addHandler(file_handler) logger.addHandler(console_handler) # 记录日志消息 logger.debug('This is a debug message') logger.info('This is an info message') logger.warning('This is a warning message') logger.error('This is an error message') logger.critical('This is a critical message') ``` 在上面的代码中,我们首先创建一个名为'my_logger'的logger对象,并设置其日志级别为DEBUG。然后,我们创建一个文件处理程序`file_handler`和一个控制台处理程序`console_handler`。接下来,我们创建一个日志消息格式化器`formatter`,并将其添加到处理程序中。最后,我们将处理程序添加到logger对象中。 通过使用不同的日志级别,我们可以控制记录的日志消息的详细程度。常用的日志级别包括DEBUG、INFO、WARNING、ERROR和CRITICAL。在上面的示例中,我们分别记录了不同级别的日志消息。 使用logger可以将日志消息同时输出到文件和控制台,方便查看和分析。你可以根据需要选择只使用文件处理程序或控制台处理程序。 希望这个简单教程能对你理解logger的基本用法有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JTZ001

你的鼓励是我创作的最大动力?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值