Java日志
日志简介
日志级别
日志级别 | 等级 | 说明 |
---|---|---|
OFF | 关闭 | 不输出日志 |
FATAL | 致命 | 输出非常严重的可能会导致应用程序终止的错误 |
ERROR | 错误 | 输出错误,但应用还能继续运行 |
WARN | 警告 | 输出可能潜在的危险状况 |
INFO | 信息 | 输出应用运行过程的详细信息 |
DEBUG | 调试 | 输出更细致的对调试应用有用的信息 |
TRACE | 跟踪 | 输出更细致的程序运行轨迹 |
ALL | 所有 | 输出所有级别信息 |
log.debug("debug message");
log.warn("warn message");
log.info("info message");
log.error("error message");
log.trace("trace message");
日志优先级别标准顺序为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
日志框架
Log4j
-
引入依赖
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
log4j.properties
###配置日志根Logger log4j.rootLogger=DEBUG,stdout,D,E,I,file #ERROR 为严重错误 主要是程序的错误 #WARN 为一般警告,比如session丢失 #INFO 为一般要显示的信息,比如登录登出 #DEBUG 为程序的调试信息 log4j.additivity.org.apache=true ###配置日志信息输出目的地Appender log4j.appender.stdout=org.apache.log4j.ConsoleAppender ### 输出到日志文件 ### #org.apache.log4j.ConsoleAppender(控制台) #org.apache.log4j.FileAppender(文件) #org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件) #org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) #org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) #log4j.appender.error.Target=System.out log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = /data/log/bill.debug.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm # '.'yyyy-MM:每月 # '.'yyyy-ww:每周 # '.'yyyy-MM-dd:每天 # '.'yyyy-MM-dd-a:每天两次 # '.'yyyy-MM-dd-HH:每小时 # '.'yyyy-MM-dd-HH-mm:每分钟 #log4j.appender.file.MaxFileSize=1MB ###滚动文件的最大数 #log4j.appender.file.MaxBackupIndex=8 log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] [ET:%X{ENV_TYPE},AN:%X{APP_NAME},SN:%X{SERVICE_NAME},CN:%X{CONTAINER_NAME},CI:%X{CONTAINER_IP}] %m%n log4j.appender.file.Threshold=DEBUG ###将消息增加到指定文件中,false指将消息覆盖指定的文件内容 log4j.appender.file.append=true ###日志的保存位置 #log4j.appender.file.File=E:/logs/file-debug-log.log log4j.appender.file.File=E:/logs/debug-debug.log ###每天产生一个日志文件 #log4j.appender.file=org.apache.log4j.DailyRollingFileAppender #log4j.appender.file.layout=org.apache.log4j.PatternLayout #log4j.appender.file.maxFileSize=100 #log4j.appender.file.maxBackupIndex=5 #log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] [ET:%X{ENV_TYPE},AN:%X{APP_NAME},SN:%X{SERVICE_NAME},CN:%X{CONTAINER_NAME},CI:%X{CONTAINER_IP}] %m%n #log4j.appender.file.Threshold=DEBUG #log4j.appender.file.append=true #log4j.appender.file.File=E:/logs/debug-log.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG ###配置日志信息的格式(布局) log4j.appender.stdout.layout=org.apache.log4j.PatternLayout #org.apache.log4j.HTMLLayout(以HTML表格形式布局) #org.apache.log4j.PatternLayout(可以灵活地指定布局模式) #org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串) #org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) log4j.appender.D.layout = org.apache.log4j.PatternLayout ###配置日志打印的格式格式化日志信息 #%m 输出代码中指定的消息 #%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL #%r 输出自应用启动到输出该log信息耗费的毫秒数 #%c 输出所属的类目,通常就是所在类的全名 #%t 输出产生该日志事件的线程名 #%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n” #%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS} #%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数 log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n ### 输出到日志文件 ### log4j.appender.I = org.apache.log4j.DailyRollingFileAppender log4j.appender.I.File = /data/log/bill.info.log log4j.appender.I.Append = true log4j.appender.I.Threshold = INFO log4j.appender.I.layout = org.apache.log4j.PatternLayout log4j.appender.I.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n ### 保存异常信息到单独文件 ### log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File = /data/log/bill.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% + `private final Logger logger = LoggerFactory.getLogger(当前类名.class);` + `logger.info("create address info: [{}], [{}]", loginUser.getUserId(), JSON.toJSONString(id));`
-
使用:
private final Logger logger = LoggerFactory.getLogger(当前类名.class);
logger.info("create address info: [{}], [{}]", loginUser.getUserId(), JSON.toJSONString(id));
Slf4j
SLF4J:日志门面( Simple Logging Facade for Java SLF4J)作为门面或抽象,用来服务于各种各样的日志框架,比如java.util.logging
、logback
和log4j
。日志标准,并不是日志系统的具体实现
- 提供日志接口
- 提供获取具体日志对象的方法
使用场景:
- 在 service 或 单元测试类进行日志输出
避免使用:
System.out.print
e.printStackTrace()
- 不要使用错误的日志级别
- 不要在循环中打印日志
需要安装 Lombok 插件
注解
- 在需要使用的类添加
@Slf4j
注解 log.info("create address info: [{}], [{}]", loginUser.getUserId(), JSON.toJSONString(id));
编码
private final Logger logger = LoggerFactory.getLogger(当前类名.class);
logger.info("create address info: [{}], [{}]", loginUser.getUserId(), JSON.toJSONString(id));
Logback
Logger 可以被分配级别:TRACE、DEBUG、INFO、WARN 和 ERROR
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-M-d HH:mm:ss} %t %p %m%n</pattern>
</encoder>
</appender>
<appender name="springboot"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- <Encoding>UTF-8</Encoding> -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover 保存历史记录到这个文件夹一日起为后缀 -->
<FileNamePattern>logs/logback/springboot_%d{yyyy-M-d}.log
</FileNamePattern>
<!-- keep 10 days' worth of history -->
<MaxHistory>10</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-M-d HH:mm:ss} %t %p %m%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
</appender>
<appender name="xxx-xsp-basicinfo"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/logback/faw_tsp_basicinfo_%d{yyyy-M-d}.log
</FileNamePattern>
<MaxHistory>100</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-M-d HH:mm:ss} %t %p %m%n</pattern>
</encoder>
</appender>
<logger name="org.springframework.boot" level="info" additivity="false">
<appender-ref ref="stdout"/>
<appender-ref ref="springboot"/>
</logger>
<!-- name包必须能够扫描到所有类,包括启动类 -->
<logger name="com.xxx.xsp.basicinfo" level="info" additivity="false">
<appender-ref ref="xxx-xsp-basicinfo"/>
<appender-ref ref="stdout"/>
</logger>
<root level="info">
<appender-ref ref="stdout"/>
<appender-ref ref="springboot"/>
<appender-ref ref="xxx-xsp-basicinfo"/>
</root>
</configuration>