log日志配置简述

近期进行log升级,简单配置了下几种常用日志,分别是log4j、log4j2、logback。简单整理,不全不深,仅备后用。
需求:将应用日志以控制台或文件的形式输出。

一、log4j

(1)引入jar包

下载并引入log4j的jar包,log4j-1.*.jar,笔者用的是 log4j-1.2.17.jar。

(2)log的主要节点

log配置文件主要包含三个节点:Logger、Appender、Layout。
Logger:配置打印日志的级别,输出日志的程序范围,以及关联的Appender。
Appender:配置日志的输出形式,输出策略等。
Layout:配置每条日志的内容格式。

(3)配置log4j.properties文件,示例:
#配置根节点
log4j.rootLogger=INFO,Log4jConsole,Log4jFile
#log不向上层传递
log4j.additivity.org.appache=false
#设置变量,保存路径 ${catalina.home}/logs
logDir=D:/tomcat/logs

#控制台输出
log4j.appender.Log4jConsole=org.apache.log4j.ConsoleAppender
log4j.appender.Log4jConsole.Threshold=INFO
log4j.appender.Log4jConsole.ImmediateFlush=true
log4j.appender.Log4jConsole.Target=System.out
#输出格式
log4j.appender.Log4jConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.Log4jConsole.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n

#文件输出
log4j.appender.Log4jFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.Log4jFile.Threshold=INFO
log4j.appender.Log4jFile.ImmediateFlush=true
log4j.appender.Log4jFile.Append=true
log4j.appender.Log4jFile.File=${logDir}/log4j.log
log4j.appender.Log4jFile.DatePattern='.'yyyy-MM-dd
#输出格式
log4j.appender.Log4jFile.layout=org.apache.log4j.PatternLayout
log4j.appender.Log4jFile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n

说明:
1.Logger节点配置,“log4j.rootLogger=INFO,Log4jConsole,Log4jFile”。
rootLogger为根节点,必须配置项。日志输出范围为整个project。
若需配置logger子节点,支持以包名或类名控制日志范围。如:log4j.logger.com.demo=*,“com.demo”为程序包名,表示配置该包名范围内的日志。
2.INFO为日志级别,表示输出INFO级别及以上的日志。
常用日志级别:DEBUG < INFO < WARN < ERROR。
3.log4j.additivity属性,表示根据程序的层级结构,下层日志是否向上层传递。
4.Appender节点,示例中的Log4jConsole,Log4jFile均为Appender名称。常用的Appender类型有:
org.apache.log4j.ConsoleAppender,控制台形式输出日志。
org.apache.log4j.DailyRollingFileAppender,按时间策略,文件形式输出日志。
org.apache.log4j.RollingFileAppender,按文件大小策略,文件形式输出日志。
其中:log4j.appender. * .File,设置当前日志文件名称。
log4j.appender.*.DatePattern,设置时间维度,支持按天、按小时等精度生成日志。
5.若以文件形式输出日志,可设置文件保存的相对路径,如tomcat的“${catalina.home}”。
6.Layout设置每条日志内容的输出格式,Layout支持多种类型格式,笔者此次使用的是“org.apache.log4j.PatternLayout”。
设置格式:

[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n

代码调用:

logger.info("it is a log for log4j!");

运行效果:

[INFO][2017-08-26 10:22:23][com.demo.log.Log4jTest:writeLog:41]it is a log for log4j!
格式化符号意义备注
%p日志级别如:INFO、WARN
%d时间可设置格式,%d{yyyy_MM_dd HH:mm:ss}
%t线程名
%c类名如:%-20c,表示,左对齐,最大长度20
%M方法名
%L行号
%m日志内容代码输出的内容
%n换行
(4)代码引用

此处为了说明,代码使用log4j自身的类写log。具体运用建议使用slf4j形式,具体后面讲解。

import org.apache.log4j.Logger;
......
private static Logger logger = Logger.getLogger(Log4j2Test.class);
......
logger.info("it is a log for log4j!");

log4j、log4j2、logback的配置项相似,只是语法不同,后面仅简述不同的地方,不重复说明。

二、log4j2

(1)引入jar包
下载并引入log4j的jar包,log4j-api-2.*.jar,log4j-core-2.*.jar。笔者用的是 log4j-api-2.8.2.jar,log4j-core-2.8.2.jar。
(2)配置log4j2.xml文件,示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="60">
      <Properties>
            <!-- 日志输出路径变量 ${sys:catalina.home}/logs -->
            <Property name="logDir" value="D:/tomcat/logs" />

      <Appenders>
            <!-- 控制台输出 -->
            <Console name="Log4j2Console" target="SYSTEM_OUT">
                  <PatternLayout
                        pattern="[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n" />
            </Console>

            <!-- 文件输出 -->
            <RollingFile name="Log4j2File" fileName="${logDir}/log4j2.log"
                  filePattern="${logDir}/log4j2.log.%d{yyyy-MM-dd}">
                  <PatternLayout
                        pattern="[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n" />
                  <Policies>
                        <TimeBasedTriggeringPolicy />
                        <SizeBasedTriggeringPolicy size="100MB" />
                  </Policies>
            </RollingFile>
      </Appenders>

      <Loggers>
            <Root level="INFO">
                  <appender-ref ref="Log4j2Console" />
                  <appender-ref ref="Log4j2File"/>
            </Root>
      </Loggers>
</Configuration>

说明:
1.Configuration标签中的monitorInterval属性,表示自动扫描的间隔秒数。log4j2定时扫描配置文件,当配置文件发生变化,将重新加载生效。
2.status属性,表示查看log4j2内部日志的日志级别,应用可查看log4j2内部的加载日志。
3.若设置tomcat的相对路径保存日志文件,使用 ${sys:catalina.home},和log4j有区别。
4.RollingFile 文件形式输出日志,支持通过时间、文件大小两种策略生成文件。
5.RollingFile节点的filename属性,可设置当前文件名包含时间戳。如:

fileName="${log.dir}/log4j2.log.${date:yyyy-MM-dd}"

6.本实例中仅配置了root根日志节点,若需配置子节点,在中添加子节点即可。

    <Logger level="INFO" name="com.demo.log" additivity="false">
        <appender-ref ref="Log4j2Console" />
    </Logger>

7.log4j2支持配置异步写log,以提升日志打印效率。配置如下:

      <Appenders>
              <RollingRandomAccessFile name="Log4j2File"
                  fileName="${logDir}/log4j2.log" filePattern="${log.dir}/log4j2.log.%d{yyyy-MM-dd}">
                  <PatternLayout>
                        <Pattern>[%p] %d{MM-dd HH:mm:ss,SSS}-(%c:%M:%L) %m%n</Pattern>
                  </PatternLayout>
                  <Policies>
                        <TimeBasedTriggeringPolicy />
                  </Policies>
            </RollingRandomAccessFile>
            ......
      </Appenders>
      <Loggers>
            <AsyncLogger name="com.demo.log"
                  level="INFO" additivity="false">
                  <AppenderRef ref="Log4j2File" />
            </AsyncLogger>
            ......
      </Loggers>
(3)代码引用

此处为了说明,代码使用log4j2自身的类写log。具体运用建议使用slf4j形式,具体后面讲解。

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
......
private static Logger logger = LogManager.getLogger(Log4j2Test.class);
......
logger.info("it is a log for log4j2!");

三、logback

(1)引入jar包

下载并引入jar包,笔者用的是:slf4j-api-1.7.7.jar,logback-core-1.1.2.jar,logback-classic-1.1.2.jar。

(2)配置logback.xml文件,配置文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration scan="true" scanPeriod="60 seconds" debug="true">
      <!-- 60s 自动扫描配置 -->
      <!-- 文件路径变量 ${catalina.home}/logs -->
      <Property name="logDir" value="D:/tomcat/logs" />
      <!-- 控制台输出 -->
      <Appender name="LogbackConsole" class="ch.qos.logback.core.ConsoleAppender">
            <Encoder>
                  <Pattern>[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C:%M:%L]%m%n
                  </Pattern>
            </Encoder>
      </Appender>
      <!-- 文件输出 -->
      <Appender name="LogbackFile"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>${logDir}/logback.log</File>
            <Append>true</Append>
            <RollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                  <FileNamePattern>${logDir}/logback.log.%d{yyyy-MM-dd}.%i
                  </FileNamePattern>
            </RollingPolicy>
            <TriggeringPolicy
                  class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                  <MaxFileSize>100MB</MaxFileSize>
            </TriggeringPolicy>
            <Encoder>
                  <Pattern>[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C:%M:%L]%m%n
                  </Pattern>
            </Encoder>
      </Appender>

      <Root level="INFO">
            <Appender-ref ref="LogbackConsole" />
            <Appender-ref ref="LogbackFile" />
      </Root>
</Configuration>

说明:
1.logback可设置历史日志文件自动压缩,设置fileNamePattern属性添加“.gz”后缀即可。

<fileNamePattern>${log.dir}/logback.log.%i.%d{yyyy-MM-dd}.gz</fileNamePattern>

logback、log4j2的配置文件较相似,读懂了上面log4j2的配置文件,再看logback的配置就很轻松,不做过多说明。

(3)代码引用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......
private final static Logger logger = LoggerFactory
        .getLogger(LogbackTest.class);
......
logger.info("it is a log for logback!");

四、slf4j

slf4j,Simple Logging Facade for Java,Java简单日志门面。它不实现日志打印,只是通过门面模式提供log的api。

此处假装有图的样子

(1)引入jar包,以slf4j+log4j为例:
1. slf4j-api.jar,提供api给应用,如LoggerFactory工厂类。
2. slf4j-log4j.jar,桥接包,关联slf4j及log4j。
3. log4j-*jar,log4j的jar包,实现log打印。
(2)代码采用slf4j形式,同logback的代码示例:

private final static Logger logger = LoggerFactory
        .getLogger(LogbackTest.class);
......
logger.info("it is a log for {}!",type);
......

(3)slf4j的好处:1、统一使用slf4j形式写log,不用修改源码,便于日志升级。2、log参数使用占位符{},不使用字符串拼接,语句清晰,性能更好。


写log是一种艺术,良好的log有利于定位问题。

ps:本文仅简单记录三种log的基本配置,许多点并未涉及到。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值