前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >打印日志的几种方式

打印日志的几种方式

作者头像
我的小碗汤
发布2018-08-22 10:42:04
1.2K0
发布2018-08-22 10:42:04
举报
文章被收录于专栏:我的小碗汤我的小碗汤

log4j的方式:

只需要引用以下依赖即可:

代码语言:javascript
复制
<!-- 日志相关包 -->
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

log4j.properties文件配置:

代码语言:javascript
复制
#log4j.rootLogger = [ level ] , appenderName1, appenderName2, … 
#level:日志级别由高到低分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,以及自定义级别;
#一般使用ERROR、WARN、INFO、DEBUG就够了,如果级别定义为INFO,那么日志中只会显示比INFO级别高的日志。
#appenderName1:指定日志输出位置,可任意,如A,B,C多个
log4j.rootLogger = DEBUG,root,stdout

#输出到控制台,stdout和上面设置的名字对应
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSSXXX} %-5p [%t] [%C %L] %m%n

#输出到文件,root和上面设置的名字对应
log4j.appender.root.Append=true
#指定日志输出文件位置 scheduleProject为web.xml配置
log4j.appender.root.File=${scheduleProject}WEB-INF/logs/root.log
#指定日志输出格式
log4j.appender.root.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSSXXX} %-5p [%t] [%C %L] %m%n
#自定义布局
log4j.appender.root.layout=org.apache.log4j.PatternLayout
#日志文件最大备份数
log4j.appender.root.MaxBackupIndex=50
#每个文件最大20M
log4j.appender.root.MaxFileSize=20MB
#按大小滚动文件输出,把日志输出到指定的文件,文件达到指定大小时,会自动更名
log4j.appender.root=org.apache.log4j.RollingFileAppender
#zip文件的权限
log4j.appender.root.zipPermission=400
#log文件的权限
log4j.appender.root.logPermission=600

web.xml中主要配置:

代码语言:javascript
复制
<!-- 加载log4j的配置文件log4j.properties -->
<context-param>
  <param-name>log4jConfigLocation</param-name>
  <param-value>classpath:config/log4j.properties</param-value>
</context-param>

<!-- 设定刷新日志配置文件的时间间隔,这里设置为10s -->
<context-param>
  <param-name>log4jRefreshInterval</param-name>
  <param-value>10000</param-value>
</context-param>

<!-- 加载Spring框架中的log4j监听器Log4jConfigListener -->
<listener>
  <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

<!-- 为避免项目间冲突,定义唯一的 webAppRootKey -->
<context-param>
  <param-name>webAppRootKey</param-name>
  <param-value>scheduleProject</param-value>
</context-param>

调用:

代码语言:javascript
复制
import org.apache.log4j.Logger;

public class ProjectController {

  private static Logger logger = Logger.getLogger(ProjectController.class);
  public String addProject() {

    logger.warn("--------------------ProjectController---------------------");
    logger.warn("projectVo is " + JSON.toJSONString(projectVo));
  }
}

如上配置后打印出来的日志如下:

log4j2方式:

log4j的主配置文件为*.properties,log4j2废弃了这种方式,采用*.xml、json等方式。

系统选择配置文件的优先级(从先到后):

classpath下log4j2-test.json或者log4j2-test.jsn;

classpath下log4j2-test.xml;

classpath下名为log4j2.json 或者log4j2.jsn;

classpath下名为log4j2.xml;

需要依赖以下依赖:

代码语言:javascript
复制
<!-- 日志相关包 -->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.5</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>2.5</version>
</dependency>

我们用log4j2.xml,将此文件放在classpath下,按照以下方式配置,日志将输出到tomcat_home/bin下的logs目录里:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="debug" monitorInterval="30">
  <!-- 先定义所有的appender -->
  <appenders>
    <!-- 这个输出控制台的配置 -->
    <Console name="Console" target="SYSTEM_OUT">
      <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
      <ThresholdFilter level="trace" onMatch="ACCEPT"
        onMismatch="DENY" />
      <!-- 这个都知道是输出日志的格式 -->
      <PatternLayout
        pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
    </Console>

    <!-- 文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
    <!-- append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
    <File name="log" fileName="logs/test.log" append="false">
      <PatternLayout
        pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
    </File>

    <!-- 添加过滤器ThresholdFilter,可以有选择的输出某个级别以上的类别 onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否则直接拒绝 -->
    <File name="ERROR" fileName="logs/error.log">
      <ThresholdFilter level="error" onMatch="ACCEPT"
        onMismatch="DENY" />
      <PatternLayout
        pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n" />
    </File>

    <!-- 这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
    <RollingFile name="RollingFile" fileName="logs/web.log"
      filePattern="logs/$${date:yyyy-MM}/web-%d{MM-dd-yyyy}-%i.log.gz">
      <PatternLayout
        pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n" />
      <SizeBasedTriggeringPolicy size="2MB" />
    </RollingFile>
  </appenders>

  <!-- 然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
  <loggers>
    <!-- 建立一个默认的root的logger -->
    <root level="trace">
      <appender-ref ref="RollingFile" />
      <appender-ref ref="Console" />
      <appender-ref ref="ERROR" />
      <appender-ref ref="log" />
    </root>

  </loggers>
</configuration>

web.xml无需添加log相关的配置,调用如下:

代码语言:javascript
复制
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class ProjectController {

  private static Logger logger = LogManager.getLogger(ProjectController.class);

  public String addProject() {

    logger.warn("--------------------ProjectController---------------------");
    logger.warn("projectVo is {}", JSON.toJSONString(projectVo);
  }
}

输出日志格式如下:

slf4j方式:

代码语言:javascript
复制
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.21</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.21</version>
</dependency>

web.xml和log4j.properties配置文件和log4j一样。

slf4j和log4j2方式记录日志,我们不需要字符串连接而且不会导致暂时不需要的字符串消耗。取而代之,我们在一个以占位符和参数传递实际值构成的模板格式下写日志信息。调用如下:

代码语言:javascript
复制
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ProjectController {

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

  public String addProject() {

    logger.warn("--------------------ProjectController---------------------");
    logger.warn("projectVo is {}", JSON.toJSONString(projectVo);
  }
}

logback方式:

需要三个jar包:

只依赖以下即可引入上面三个jar:

代码语言:javascript
复制
<!-- 实现slf4j接口并整合 -->
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.3</version>
  <!-- <scope>test</scope>-->
</dependency>

需要名为logback.xml的配置文件,放在classpath下即可:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<configuration debug="false">
    <appender name="INFO-FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${catalina.base}/webapps/logs/info/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${catalina.base}/webapps/logs/info/info.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>1024MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{55} -
                %msg%n
            </pattern>
        </layout>
    </appender>
    <appender name="ACCESS-FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>
            ${catalina.base}/webapps/logs/access/access.log
        </file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${catalina.base}/webapps/logs/access/access.%d{yyyy-MM-dd}.%i.log.zip
            </FileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>1024MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{55} -
                %msg%n
            </pattern>
        </layout>
    </appender>
    <logger name="com.website" level="DEBUG" additivity="true">
        <appender-ref ref="ACCESS-FILE"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="INFO-FILE"/>
    </root>
</configuration>

${catalina.base}为tomcat_home目录。

参考文章:

log4j2介绍:

http://www.cnblogs.com/hafiz/p/6170702.html

slf4j介绍:

https://blog.csdn.net/foreverling/article/details/51385128

Log4j迁移到LogBack理由:

https://www.oschina.net/translate/reasons-to-prefer-logbak-over-log4j

SpringMVC与LogBack集成:

https://blog.csdn.net/luckyzhoustar/article/details/49450759

log4j和Log4j2的区别:

https://blog.csdn.net/FANGAOHUA200/article/details/53561718

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档