博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Log日志(一)
阅读量:3967 次
发布时间:2019-05-24

本文共 9837 字,大约阅读时间需要 32 分钟。

日志

1.1常见日志框架

在项目开发过程中,我们可以通过 debug 查找问题。而在线上环境我们查找问题只能通过打印日志的方式查找问题。因此对于一个项目而言,日志记录是一个非常重要的问题。因此,如何选择一个合适的日志记录框架也非常重要。

在Java开发中,目前常用的日志框架包括Log4j 1,Log4j 2,Commons Logging,Slf4j,Logback,Jul。这些日志记录框架各有各的特点,各有各的应用场景。了解这些框架的特点及应用场景,有利于我们做技术选型的时候做出正确的判断。

框架 说明
Log4j Apache Log4j是一个基于Java的日志记录工具。它是由Ceki首创的,现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。
Log4j 2 Apache Log4j 2是apache开发的一款Log4j的升级产品。
Commons Logging Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名为Commons Logging。
Slf4j 类似于Commons Logging,是一套简易Java日志门面,本身并无日志的实现。(Simple Logging Facade for Java,缩写Slf4j)。
Logback 一套日志组件的实现(Slf4j阵营)
Jul (Java Util Logging),自Java1.4以来的官方日志实现。

1.2日志框架关系

  1. Log4j 2与Log4j 1发生了很大的变化,Log4j 2不兼容Log4j1。
  2. Commons Logging和Slf4j是【日志门面】(门面模式是软件工程中常用的一种软件设计模式,也被称为正面模式、外观模式。它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用)。
    Log4j和Logback则是具体的日志实现方案。可以简单的理解为接口与接口的实现,调用者只需要关注接口而无需关注具体的实现,做到解耦。
  3. 比较常用的组合使用方式是Slf4j与Logback组合使用,Commons Logging与Log4j组合使用。

未来使用Slf4j与Logback组合会越来越多

(1)Slf4j实现机制决定Slf4j限制较少,使用范围更广
(2)Logback拥有更好的性能。
(3)Logback文档免费。

1.3 log4j的使用

显示级别【重要】

共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。

log4j 1.2.x版本的使用

依赖信息

commons-logging
commons-logging
1.2
log4j
log4j
1.2.17

第一步:配置文件:【log4j.properties】

### set log levels - for more verbose logging change 'info' to 'debug' , 'off' ######info打印部分信息,trace打印所有信息,包含跟踪信息,off关闭不打印###log4j.rootLogger=info, stdout,file###1 direct log messages to stdout 打印到控制台###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.errlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{
ABSOLUTE} %5p %c{
1}:%L - %m%n###2 direct messages to file mylog.log 打印到路径文件###log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=d:\\mylog.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d{
ABSOLUTE} %5p %c{
1}:%L - %m%n###3每天生成一个文件【选用】log4j.appender.daily=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.daily.File=d:\\logs\\soso.loglog4j.appender.daily.Append=truelog4j.appender.daily.Threshold=INFOlog4j.appender.daily.ImmediateFlush=true#生成一个配置文件 命名 soso.8888-88-88-88 时间log4j.appender.daily.DatePattern='_'yyyy-MM-dd'.txt'log4j.appender.daily.layout=org.apache.log4j.PatternLayoutlog4j.appender.daily.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n###4控制每个滚动日志文件大小和个数,要在log4j.rootLogger后添加【R】###log文件个数最多5个,每个log文件1kb限制【选用】log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.Threshold=DEBUG log4j.appender.R.File=d:\\logs\\test.log log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d{
yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%nlog4j.appender.R.MaxFileSize=1kblog4j.appender.R.MaxBackupIndex=5

log4jPatternLayout代码

参数 说明 例子
%c 列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间 log4j配置文件参数举例 输出显示媒介
假设当前logger名字空间是“a.b.c”
%c a.b.c
%c{2} b.c
%20c (若名字空间长度小于20,则左边用空格填充)
%-20c (若名字空间长度小于20,则右边用空格填充)
%.30c (若名字空间长度超过30,截去多余字符)
%20.30c (若名字空间长度小于20,则左边用空格填充;若名字空间长度超过30,截去多余字符)
%-20.30c (若名字空间长度小于20,则右边用空格填充;若名字空间长度超过30,截去多余字符)
%C 列出调用logger的类的全名(包含包路径) 假设当前类是“org.apache.xyz.SomeClass”
%C org.apache.xyz.SomeClass
%C{2} xyz.SomeClass
%d 显示日志记录时间,{<日期格式>}使用ISO8601定义的日期格式 %d{yyyy/MM/dd HH:mm:ss,SSS} 2005/10/12 22:23:30,117
%d{ABSOLUTE} 22:23:30,117
%d{DATE} 12 Oct 2005 22:23:30,117
%d{ISO8601} 2005-10-12 22:23:30,117
%F 显示调用logger的源文件名 %F MyClass.java
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数 %l MyClass.main(MyClass.java:129)
%L 显示调用logger的代码行 %L 129
%m 显示输出消息 %m This is a message for debug.
%M 显示调用logger的方法名 %M main
%n 当前平台下的换行符 %n Windows平台下表示rn UNIX平台下表示n
%p 显示该条日志的优先级 %p INFO
%r 显示从程序启动时到记录该条日志时已经经过的毫秒数 %r 1215
%t 输出产生该日志事件的线程名 %t MyClass
%x 按NDC(Nested Diagnostic Context,线程堆栈)顺序输出日志 假设某程序调用顺序是MyApp调用com.foo.Bar
%c %x - %m%n MyApp - Call com.foo.Bar. com.foo.Bar - Log in Bar MyApp - Return to MyApp.
%X 按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是那个客户端访问留下来的日志。 %X{5} (记录代号为5的客户端的日志)
%% 显示一个百分号 %% %

第二步 编写java类测试:

import org.apache.log4j.Logger;public class Demo1 {
public static void main(String[] args) {
//不用日志框架 System.out.println("xxxx"); Logger logger = LogManager.getLogger(LogDemo2.class.getName()); //门面使用 //Log log = LogFactory.getLog(Demo2.class.getName()); //使用日志 logger.trace("跟踪信息"); logger.debug("调试信息"); logger.info("信息"); logger.warn("警告信息"); logger.error("错误信息"); logger.fatal("致命错误"); }}

1.4 log4j 2.x的使用

依赖信息

commons-logging
commons-logging
1.2
org.apache.logging.log4j
log4j-core
2.11.1
org.apache.logging.log4j
log4j-jcl
2.11.1

第一步:配置文件:log4j2.xml

第二步 编写java类测试:

import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;/** * @author wgy 2018/12/10 21:52 * @version 1.0 */public class LogDemo2 {
public static void main(String[] args){
Logger logger = LogManager.getLogger(LogDemo2.class.getName()); //门面使用 //Log log = LogFactory.getLog(Demo2.class.getName()); logger.trace("entry"); //等同于logger.entry();但此方法在新版本好像已经废弃 logger.error("Did it again!"); logger.info("这是info级信息"); logger.debug("这是debug级信息"); logger.warn("这是warn级信息"); logger.fatal("严重错误"); logger.trace("exit"); }}//打印结果2019-09-18 19:10:13,378 WARN [main] log.Demo1 (Demo1.java:31) - 警告信息2019-09-18 19:10:13,381 ERROR [main] log.Demo1 (Demo1.java:32) - 错误信息2019-09-18 19:10:13,381 FATAL [main] log.Demo1 (Demo1.java:33) - 致命错误

1.5 logback和slf4j的使用【重要】

logback是java的日志开源组件,是log4j创始人写的,性能比log4j要好,目前主要分为3个模块

  1. logback-core:核心代码模块
  2. logback-classic:log4j的一个改良版本,同时实现了slf4j的接口,这样你如果之后要切换其他日志组件也是一件很容易的事
  3. logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能

依赖如下

ch.qos.logback
logback-core
1.2.3
ch.qos.logback
logback-classic
1.2.3
org.slf4j
slf4j-api
1.7.26

logback.xml

简单模式

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
true
${LOG_HOME}${bySecond}.log
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n
true
false

高级模式

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
true
${log.base}TEST_ERROR-%d{yyyy-MM-dd}.log
5
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
ERROR
ACCEPT
DENY
true
${log.base}TEST_WARN-%d{yyyy-MM-dd}.log
5
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
WARN
ACCEPT
DENY
true
${log.base}TEST_INFO-%d{yyyy-MM-dd}.log
5
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
INFO
ACCEPT
DENY
true
${log.base}TEST_DEBUG-%d{yyyy-MM-dd}.log
5
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
DEBUG
ACCEPT
DENY

代码如下

Logger logger = LoggerFactory.getLogger(Demo3.class.getName());logger.trace("跟踪信息_logback");logger.debug("调试信息_logback");logger.info("基本信息_logback");logger.warn("警告信息_logback");logger.error("错误信息_logback");//打印结果2019-09-18 19:21:33.067 [main] DEBUG com.rj.log.Demo1 - 调试信息2019-09-18 19:21:33.069 [main] INFO  com.rj.log.Demo1 - 信息2019-09-18 19:21:33.069 [main] WARN  com.rj.log.Demo1 - 警告信息2019-09-18 19:21:33.069 [main] ERROR com.rj.log.Demo1 - 错误信息

转载地址:http://spgzi.baihongyu.com/

你可能感兴趣的文章
linux 文件权限
查看>>
一些比较好的golang安全项目
查看>>
HTTP状态码
查看>>
go语言
查看>>
mysql mariaDB 以及存储引擎
查看>>
游戏行业了解介绍
查看>>
linux at 命令使用
查看>>
Go在windows下执行命令行指令
查看>>
inotify
查看>>
inode
查看>>
Shell: sh,bash,csh,tcsh等shell的区别
查看>>
golang ubuntu 配置 笔记
查看>>
vim 常用命令
查看>>
golang 开源项目
查看>>
ubntu 开发服务进程
查看>>
linux 常用命令以及技巧
查看>>
记录1年免费亚马逊AWS云服务器申请方法过程及使用技巧
查看>>
golang文章
查看>>
Source Insight 经典教程
查看>>
快速打开菜单附件中的工具
查看>>