1.简介

为了方便查看和归档:(1)不同包的日志可能要放到不同的文件中,如service层和dao层的日志;(2)不同日志级别:调试、信息、警告和错误等也要分文件输出。所以宏哥今天主要介绍和分享的是:使用logback输出日志到不同文件。废话不说直入主题。

2.第一种方法:根据包输出

根据包输出,通过logger的name属性指定不同的包,具体步骤如下:

1. 创建不同包下的两个类

2. 在logback(-test).xml中添加

3. 测试方法

2.1创建不同包

1.创建不同包并在包下新建类ADao和BService。如下图所示:

(1)ADao

(2)BService

2.参考代码

(1)ADao.java

package dao;

import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Logger; /**
* @author 北京-宏哥
*
* @公众号:北京宏哥
*
* 《手把手教你》系列基础篇(九十一)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-下篇(详解教程)
*
* 2022年3月29日
*/ public class ADao {
static final Logger log = (Logger) LoggerFactory.getLogger(ADao.class); public void queryADao() {
log.debug("query queryADao start...");
log.error("An error occurred during the query");
log.debug("query queryADao end...");
}
}

(2)BService.java

package service;

import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Logger;
import dao.ADao; /**
* @author 北京-宏哥
*
* @公众号:北京宏哥
*
* 《手把手教你》系列基础篇(九十一)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-下篇(详解教程)
*
* 2022年3月29日
*/ public class BService { static final Logger log = (Logger) LoggerFactory.getLogger(BService.class);
ADao ad = new ADao();
public void bObligate() {
log.debug("bObligate start...");
ad.queryADao();
log.error("An error occurred during the progress");
log.debug("bObligate end...");
}
}

2.2logback.xml

1.新建logback.xml文件,而且在logback.xml中添加如下图所示内容:

2.参考代码

<?xml version="1.0" encoding="UTF-8"?>  

<configuration>
<appender name="serviceAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs2/bribery.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/logs2/bribery-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
</encoder>
</appender> <appender name="daoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs2/venality.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>./logs2/venality-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
</encoder>
</appender> <logger name="service.BService" level="DEBUG" additivity="false">
<appender-ref ref="serviceAppender" />
</logger> <logger name="dao.ADao" level="DEBUG" additivity="false">
<appender-ref ref="daoAppender" />
</logger> <!-- root的默认level是DEBUG -->
<root level="DEBUG">
<appender-ref ref="rollingAppender" />
</root>
</configuration>

2.3测试方法

1.新建测试类。如下图所示:

2.参考代码

import service.BService;

/**
* @author 北京-宏哥
*
* @公众号:北京宏哥
*
* 《手把手教你》系列基础篇(九十一)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-下篇(详解教程)
*
* 2022年3月29日
*/ public class testLogback { public static void main(String[] args) { BService bs = new BService();
bs.bObligate();
} }

2.4运行测试方法

1.运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示:

2.输出的日志文件,如下图所示:

3.第二种方法:根据日志级别输出

在这里宏哥把所有级别为ERROR的日志输出到一个文件中。

这里宏哥还是延续使用上边的代码,只需要一个劲的修改logback.xml文件的内容即可!

3.1加入过滤器

1.修改logback(-test).xml文件:在serviceAppender和daoAppender都加入以下级别过滤器,这样错误日志就不会在bribery.log和venality.log中打印了,代码如下:

<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>

3.2新建一个appender

1.新建一个错误日志的appender,代码如下:

<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/logs/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/logs/venality-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %thread %X{invokeNo} %logger{40} %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

3.2加上errorAppender

在name为dao.ADao和service.BService的logger都加上errorAppender,代码如下:

<appender-ref ref="errorAppender" />  

3.4完整的logback.xml文件

1.修改完成的logback.xml文件,如下图所示:

2.参考代码

<?xml version="1.0" encoding="UTF-8"?>  

<configuration>
<appender name="serviceAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs3/bribery.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/logs3/bribery-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
</appender> <appender name="daoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs3/venality.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>./logs3/venality-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
</appender>
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs3/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/logs3/venality-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %thread %X{invokeNo} %logger{40} %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="service.BService" level="DEBUG" additivity="false">
<appender-ref ref="serviceAppender" />
<appender-ref ref="errorAppender" />
</logger> <logger name="dao.ADao" level="DEBUG" additivity="false">
<appender-ref ref="daoAppender" />
<appender-ref ref="errorAppender" />
</logger> <!-- root的默认level是DEBUG -->
<root level="DEBUG">
<appender-ref ref="rollingAppender" />
</root>
</configuration>

3.5运行测试方法

1.修改完成后,运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示:

2.输出的日志文件,如下图所示:

从上图可以看出:service和dao的错误日志都打印到error.log文件中了。

4.小结

好了,时间也不早了,今天就分享和讲解到这里,希望对您有所帮助,感谢您耐心地阅读!

《手把手教你》系列基础篇(九十一)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-下篇(详解教程)的更多相关文章

  1. 《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)

    1.简介 自动化测试中如何输出日志文件.任何软件,都会涉及到日志输出.所以,在测试人员报bug,特别是崩溃的bug,一般都要提供软件产品的日志文件.开发通过看日志文件,知道这个崩溃产生的原因,至少知道 ...

  2. 《手把手教你》系列基础篇(九十)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-中篇(详解教程)

    1.简介 上一篇宏哥介绍是如何使用logback将日志输出到控制台中,但是如果需要发给相关人需要你拷贝出来,有时候由于控制台窗口的限制,有部分日志将会无法查看,因此我们还是需要将日志输出到文件中,因此 ...

  3. 《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)

    1.简介 上一篇介绍了POM的基础理论知识和非POM方式写脚本,这篇介绍利用页面工厂类(page factory)去实现POM,通过查看PageFactory类,我们可以知道它是一个初始化一个页面实例 ...

  4. 《手把手教你》系列基础篇(七十五)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 中篇(详解教程)

    1.简介 上一篇中介绍了DataProvider如何传递参数,以及和一些其他方法结合传递参数,今天宏哥接着把剩下的一些常用的也做一下简单的介绍和分享. 2.项目实战1 @DataProvider + ...

  5. 《手把手教你》系列基础篇(七十七)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试- 上篇(详解教程)

    1.简介 今天主要是讲解和分享:TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用dependsOnMethods,testNG会自动根据@Test方法名称 ...

  6. 《手把手教你》系列基础篇(七十八)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试- 中篇(详解教程)

    1.简介 上一篇讲解了依赖测试的各种方法,今天继续讲解依赖测试的方法,这一篇主要是讲解和分享通过xml文件配置组名依赖方法( 主要是测试组的用法).废话不说,直接上干货. 2.实例 测试组:一个组可包 ...

  7. 《手把手教你》系列技巧篇(七十一)-java+ selenium自动化测试-自定义类解决元素同步问题(详解教程)

    1.简介 前面宏哥介绍了几种关于时间等待的方法,也提到了,在实际自动化测试脚本开发过程,百分之90的报错是和元素因为时间不同步而发生报错.本文介绍如何新建一个自定义的类库来解决这个元素同步问题.这样, ...

  8. 《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)

    1.简介 TestNG为日志记录和报告提供的不同选项.现在,宏哥讲解分享如何开始使用它们.首先,我们将编写一个示例程序,在该程序中我们将使用 ITestListener方法进行日志记录. 2.Test ...

  9. 《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-上篇(详解教程)

    1.简介 Apache Log4j 是一个非常古老的日志框架,并且是多年来最受欢迎的日志框架. 它引入了现代日志框架仍在使用的基本概念,如分层日志级别和记录器. 2015 年 8 月 5 日,该项目管 ...

随机推荐

  1. 为什么你需要在用 Vue 渲染列表数据时指定 key

    本文改写整理自一篇博文,原文链接如下: Why you should use the key directive in Vue.js with v-for Application state and ...

  2. Lock 深入理解acquire和release原理源码及lock独有特性acquireInterruptibly和tryAcquireNanos

    https://blog.csdn.net/sophia__yu/article/details/84313234 Lock是一个接口,通常会用ReentrantLock(可重入锁)来实现这个接口. ...

  3. Math.round(11.5) 等于多少?Math.round(-11.5)等于 多少?

    Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11.四舍五 入的原理是在参数上加 0.5 然后进行下取整.

  4. nginx优化的一些建议

    1.1隐藏Nginx header里版本号信息 1.查看版本号 curl -I 127.0.0.1 HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Sat, 14 ...

  5. mian中的argv调用时为什么不是*argv

    c++main函数char * argv[]是个指针数组,元素是指针,为何argv[1]得到不是地址? 照我的理解char *argv[]保存的应该是一组指针,即地址,每个地址中保存的是char类型变 ...

  6. MTK平台电路设计01

    一.资料 获取途径MTK官网.一牛网 二.

  7. 使用Visual Studio查看C++类内存分布

    书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承.虚函数存在的情况下. 工欲善其事,必先利其器,我们先用好Visual Stu ...

  8. Ueditor上传本地音频MP3

    遇到一个项目,客户要求能在编辑框中上传录音文件.用的是Ueditor编辑器,但是却不支持本地MP3上传并使用audio标签播放,只能搜索在线MP3,实在有点不方便.这里说一下怎么修改,主要还是利用原来 ...

  9. html 不常用标签介绍

    文本元素 <wbr> 如果单词太长,或者您担心浏览器会在错误的位置换行,那么您可以使用 <wbr> 元素来添加 Word Break Opportunity(单词换行时机).英 ...

  10. uniapp清理缓存

    <template> <view class="content"> <view>应用缓存:{{storageSize}}</view> ...