IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【Java日志系列实践1】系统操作日志的标准使用 -> 正文阅读

[Java知识库]【Java日志系列实践1】系统操作日志的标准使用

1 常见日志分类

日志一般根据使用场景分为系统日志和操作日志。
系统日志:排查定位问题
操作日志:记录用户操作,业务数据回溯与统计。

2 系统日志格式

系统日志主要是为开发排查问题提供依据,日志一般打印在日志文件中,可读性要求没那么高。
SpringBoot 默认选择的是 slf4j + logback 的组合,默认会将日志打印到控制台上。

日期时间:精确到毫秒。
日志级别:打印 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 等级别日志信息。
进程 ID:当前项目进程 ID 。
分隔符:— 是分隔符,分隔符后面代表具体的日志内容。
线程名:方括号中间的内容表示线程名称。
类名:当前日志打印所属的类名称。
日志内容:开发人员设定的日志具体内容。

实际工程中规范的日志信息:

  1. 单机项目建议打印:时间(精度根据需要制定)、日志级别、线程、类名、异常堆栈、日志内容(包括方法名、关键请求参数与返回参数);
  2. 分布式项目建议额外包含:用户标识、机器ip/主机名、traceId;

在.yml文件里的配置

#单机示例
logging:
  level:
    root: debug
  pattern:
    console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) - %clr([%t]){faint} %X{userId} %X{traceId}%clr(:) {faint} %m%n%wEx"
#分布式示例
logging:
  level:
    root: info
  pattern:
    console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) -- %clr([%t]){faint} %X{hostIp} %X{userId} %X{traceId}%clr(:) %m%n%wEx"

实际工程项目中,常需要更改为其他日志系统(如 log4j2 ),则可以在配置文件里进行一些符合个人习惯的设置。
如果启动项目时觉得日志打印太多,还可以调整项目日志的记录级别为 WARN ,打印 WARN 及优先级更高的 ERROR 级别的日志。

@SpringBootTest
class LogTest {
    //LoggerFactory是slf4j的日志对象工程
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @Test
    void testPrintLog() {
        logger.trace("I am trace log..");
        logger.debug("I am debug log..");
        logger.info("I am info log..");
        logger.warn("I am warn log..");
        logger.error("I am error log..");
    }
}

(2)日志级别等自定义设置
Springboot默认的打印级别是info,而trace、debug不打印,调试时若想打印debug日志,可以在配置文件中进行自定义设置,如下:

    @GetMapping("start")
    public void normalLog(){
        List<String> requestList = new ArrayList<>();
        requestList.add("入参列表1");
        requestList.add("入参列表2");
        Gson gson = new Gson();
        //获取到用户标识
        String userNo = "userId007";
        //把用户ID放到MDC上下文中
        MDC.put("userId", userNo);
        logger.info("【normalLog】menuFolderList:{}", gson.toJson(requestList));
    }

如果启动项目时觉得日志打印太多,还可以调整项目日志的记录级别为 WARN ,打印 WARN 及优先级更高的 ERROR 级别的日志。

@WebFilter(filterName = "traceIdFilter", urlPatterns = "/*")
@Component
public class TraceFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
        MDC.put("traceId", UUID.randomUUID().toString());
        filterChain.doFilter(httpServletRequest,httpServletResponse);

        // 获取 pod ip
        String podIp = new InetUtils(new InetUtilsProperties()).findFirstNonLoopbackHostInfo().getIpAddress();
        MDC.put("hostIp", podIp);
        filterChain.doFilter(httpServletRequest, httpServletResponse);
    }

}

(3)定制操作日志配置
通过配置 Log 的配置文件,把有关操作日志的 Log 单独放到一日志文件中。不同业务日志记录到不同的文件
在logging-logback的defaults.xml文件里,对日志进行了一些基本定义,比如CONSOLE_LOG_PATTERN和LOG_FILE【边讲解边演示】
我们一起来看看控制台、日志文件的日志显示格式的自定义方式和效果【解释日期、线程号、靠左输出日志级别、全类名字符数量、日志消息换行符】
第一步: 文件配置
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger{50}- %msg%n
在logback的日志追加器XX-appender里,我们可以自己扩展更多的定义

1、yml配置日志文件

logging:
config: classpath:log4j2/log4j2-local.xml

2、xml进行日志具体配置

<configuration status="debug">
    <appenders>
        <!--异步磁盘appender,默认按天&按512M文件大小切分日志,默认最多保留30个日志文件,默认为noblocking写日志模式-->
        <XMDFile name="requestLog" fileName="request.log" rolloverMax="5"></XMDFile>

        <!--ERROR日志、WARN日志单独输出到一个文件-->
        <XMDFile name="errorLog" fileName="error.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
        </XMDFile>

        <!--日志远程上报-->
        <Scribe name="ScribeAppender">
            <!-- 在指定日志名方面,scribeCategory 和 appkey 两者至少存在一种,且 scribeCategory 高于 appkey。-->
            <!-- <Property name="scribeCategory">data_update_test_lc</Property> -->
            <LcLayout/>
        </Scribe>
        <Async name="ScribeAsyncAppender" blocking="false">
            <AppenderRef ref="ScribeAppender"/>
        </Async>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{DEFAULT} [%t] %-5p (%C{1}:%L) - %m%n"/>
        </Console>
    </appenders>

    <loggers>
        <logger name="com.meituan" level="info"/>

        <logger name="org.springframework" level="info"/>

        <root level="info">
            <appender-ref ref="requestLog"/>
            <appender-ref ref="warnLog"/>
            <appender-ref ref="errorLog"/>
            <appender-ref ref="ScribeAsyncAppender"/>
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</configuration>
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:04:04  更:2022-04-06 16:04:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:30:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码