- jul
- log4j
- jcl
- slf4j
- 1.slf4j+logback输出
- 2.slf4j适配到log4j输出
1.jul 简单测试:
jdk自带,不需要额外jar包
1.编写工具类 import java.util.logging.* public class JulUtil { public void test1(){ Logger logger = Logger.getLogger(JulService.class.getName()); logger.log(Level.FINEST,"极好的"); logger.log(Level.FINER,"挺好的的"); logger.log(Level.FINE,"好的"); logger.log(Level.CONFIG,"配置"); logger.log(Level.INFO,"普通信息"); logger.log(Level.WARNING,"警告"); logger.log(Level.SEVERE,"严重的"); logger.warning("警告的简单写法"); } } 2.测试 @Test public void test1(){ JulService service = new JulService(); service.test1(); System.out.println("111"); System.err.println("111"); }
结果输出
控制台输出结果 八月 03, 2022 2:50:16 下午 com.log.jul.JulService test1 //洋红色 111 //黑色 严重: 严重的 //洋红色 111 //洋红色 可知: 控制台是洋红色 System.err.parintln 默认打印出info后面的日志:默认配置的日志级别是Info 级别的概念:ALL2.jul-父子关系
public void test2(){ //所有logger默认的父级是java.util.logging.LogManager$RootLogger //logger父子通过名字来决定 Logger logger1 = Logger.getLogger("a"); Logger logger2 = Logger.getLogger("a.b"); Logger logger3 = Logger.getLogger("a.b.c"); System.out.println(logger3.getParent().getName());//a.b System.out.println(logger3.getParent()== logger2);//true System.out.println(logger2.getParent()== logger1);//true System.out.println(logger1.getParent());//java.util.logging.LogManager$RootLogger }3.日志重复打印
设置logger3自己的handler,会有日志重复输出的问题 ConsoleHandler handler = new ConsoleHandler(); logger3.addHandler(handler); logger3.info("logger3.info"); 控制台打印两遍日志 解决:不使用父级的handlers logger3.setUseParentHandlers(false);4.jul配置文件logging.properties
#默认继承父类 handlers= java.util.logging.ConsoleHandler #默认全局logger级别 .level= INFO #FileHandler格式 java.util.logging.FileHandler.pattern = %h/java%u.log java.util.logging.FileHandler.limit = 50000 java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter #ConsoleHandler格式 java.util.logging.ConsoleHandler.level = INFO java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter #可以设置自己包内logger级别 com.log.jul.level = SEVERE5.加载jul配置文件
public class JulService { //加载配置文件 static LogManager logManager = LogManager.getLogManager(); static{ try { logManager.readConfiguration(JulService.class.getClassLoader().getResourceAsStream("logging.properties")); } catch (IOException e) { e.printStackTrace(); } }6.代码内设置logger级别
public void test1(){ //继承配置的类,配置文件生效 // Logger logger = Logger.getLogger("com.log.jul.level.abc"); Logger logger = Logger.getLogger(JulService.class.getName()); //设置logger级别 logger.setLevel(Level.ALL); //获取到父级并设置所有handler(appender)级别 Handler[] handlers = logger.getParent().getHandlers(); for (Handler handler : handlers) { //设置handler级别 handler.setLevel(Level.ALL); }log4j1.导入依赖
log4j log4j1.2.17 2.log4j.properties配置控制台输出和输出到文件
#rootLogger日志级别,stdout,a1,a2把logger和其他的具体的appender关联 log4j.rootLogger=INFO,stdout #设置控制台的appender:stdout是appender的名字,随便起 log4j.appender.stdout=org.apache.log4j.ConsoleAppender #设置编码 log4j.appender.stdout.Encoding=UTF-8 #Target,控制台 log4j.appender.stdout.Target=System.out #控制台级别 log4j.appender.stdout.Threshold= INFO #输出格式,布局 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout #输出:$d{日期}?p日志级别 c全类名 l第几行 m自己打印的message n换行 log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %-5p %20c %L:%m %n #输出到文件,配置文件appender,每天一个文件,缺点:不会自动清除日志文件 #若是只保留7天的日志:linux内 crontad # find /home/simplecode/logs -type f -mtime +7 -exec rm -f {} ; log4j.appender.a1=org.apache.log4j.DailyRollingFileAppender #输出位置 获取项目目录--目录不需要提前创建, log4j.appender.a1.File=${user.home}/simpleCode/log4j/a1.log log4j.appender.a1.Threshold= INFO log4j.appender.a1.layout=org.apache.log4j.PatternLayout #输出:$d{日期}?p日志级别 c全类名 l第几行 m自己打印的message n换行 log4j.appender.a1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %-5p %20c %L:%m %n #输出到文件,配置文件appender,可以指定单个文件最大的size,以及保留多少个日志文件 log4j.appender.a2=org.apache.log4j.RollingFileAppender #输出位置 获取项目目录--目录不需要提前创建, log4j.appender.a2.File=${user.home}/simpleCode/log4j/a2.log #最大文件大小,保留个数(虽然不能控制日志覆盖的时间,但是确保了日志文件及时被清除) log4j.appender.a2.File.size=100MB log4j.appender.a2.MaxBackupIndex=7 log4j.appender.a2.Threshold= INFO log4j.appender.a2.layout=org.apache.log4j.PatternLayout #输出:$d{日期}?p日志级别 c全类名 l第几行 m自己打印的message n换行 log4j.appender.a2.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %-5p %20c %L:%m %n #自己业务,因为继承了rootLogger就会在stdout输出,然后a1自己配置也会输出,a2不会输出 log4j.logger.com.suisui.log4j =ERROR,a13.编写工具类
public class Log4jService { //所有的日志技术,都有父子关系概念,通过"."确定父子关系 //com.suisui.log4j.Log4jService,获取logger private static Logger logger = Logger.getLogger(Log4jService.class.getName()); public void testAPI(){ //输出日志 logger.trace("trace"); logger.debug("debug"); logger.info("info"); logger.warn("warn"); logger.fatal("fatal"); } }4.测试
public class Log4jTest { @Test public void test1(){ Log4jService service = new Log4jService(); service.testAPI(); } } 打印结果: 2022-08-03 15:39:56 FATAL com.suisui.log4j.Log4jService 19:fataljcl1.默认使用jul进行日志输出
1.1引入依赖commons-logging commons-logging1.2 1.2编写工具类
public class JclService { private Log log = LogFactory.getLog(JclService.class); public void testAPI(){ //输出日志 log.trace("trace"); log.debug("debug"); log.info("info"); log.warn("warn"); log.fatal("fatal"); } }1.3测试
@Test public void test1(){ JclService service = new JclService(); service.testAPI(); }1.4结果输出
八月 03, 2022 3:51:00 下午 com.suisui.jcl.JclService testAPI 信息: info 八月 03, 2022 3:51:00 下午 com.suisui.jcl.JclService testAPI 警告: warn 八月 03, 2022 3:51:00 下午 com.suisui.jcl.JclService testAPI 严重: fatal2.log4j依赖+log4j.properties配置文件,使用log4j进行日志输出
2.1加入依赖log4j log4j1.2.17 2.2log4j.properties
#rootLogger日志级别,stdout,a1,a2把logger和其他的具体的appender关联 log4j.rootLogger=INFO,stdout #设置控制台的appender:stdout是appender的名字,随便起 log4j.appender.stdout=org.apache.log4j.ConsoleAppender #设置编码 log4j.appender.stdout.Encoding=UTF-8 #Target,控制台 log4j.appender.stdout.Target=System.out #控制台级别 log4j.appender.stdout.Threshold= INFO #输出格式,布局 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout #输出:$d{日期}?p日志级别 c全类名 l第几行 m自己打印的message n换行 log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %-5p %20c %L:%m %n2.3工具类测试类同上
2.4结果输出2022-08-03 15:53:34 INFO com.suisui.jcl.JclService 17:info 2022-08-03 15:53:34 WARN com.suisui.jcl.JclService 18:warn 2022-08-03 15:53:34 FATAL com.suisui.jcl.JclService 19:fatalslf4j 1.slf4j+logback输出1.1依赖
org.slf4j jcl-over-slf4j1.7.25 ch.qos.logback logback-classic1.2.3 (单独引入这个也可) ch.qos.logback logback-classic1.2.3 1.2 logback.xml
logback INFO %d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n ${log.path} ${log.path}.%d{yyyy-MM-dd}.log 1 100MB 1GB %date %level [%thread] %logger{36} [%file : %line] %msg%n 1.3工具类
public class Slf4jService { //默认会去类路径下找名为logback.xml的配置文件 private static final Logger logger = LoggerFactory.getLogger(Slf4jService.class); public void testAPI(){ //输出日志 logger.trace("trace信息"); logger.debug("debug"); logger.info("info信息"); logger.warn("warn"); logger.error("error"); } }1.4测试
@Test public void test1(){ Slf4jService service = new Slf4jService(); service.testAPI(); } 结果打印: 16:27:58.828 logback [main] INFO com.suisui.slf4j.Slf4jService - info信息 16:27:58.831 logback [main] WARN com.suisui.slf4j.Slf4jService - warn 16:27:58.831 logback [main] ERROR com.suisui.slf4j.Slf4jService - error2.slf4j适配到log4j输出2.1依赖
org.slf4j slf4j-api1.7.25 org.slf4j slf4j-log4j121.7.25 2.2log4j.properties同jcl 2.2
2.3-2.4同上结果输出 2022-08-03 16:30:48 INFO com.suisui.slf4j.Slf4jService 18:info信息 2022-08-03 16:30:48 WARN com.suisui.slf4j.Slf4jService 19:warn 2022-08-03 16:30:48 ERROR com.suisui.slf4j.Slf4jService 20:error