• springboot配置log4j2,现扒现用,简单易懂


    开头

    log4j2跟之前版本的区别就不发了,那玩意上网上搜有的是介绍的

    这个文章主要是为了那些初学者上网上不好配搞得,直接扒就能用,网上其他文章不是给你讲概念,就是给你配置没发全发一半,有严谨性但是不通俗易懂。

    先看下效果图

     

     我这里有两个log,一个是info级别,一个是error级别

    在我的磁盘里会生成两种级别的日志文件,这个文件里就是单独一种级别的,方便以后为了看有哪些error,还得去log里搜。

    pom.xml

    maven引入 

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-log4j2artifactId>
    4. dependency>
    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-loggingartifactId>
    4. <exclusions>
    5. <exclusion>
    6. <groupId>*groupId>
    7. <artifactId>*artifactId>
    8. exclusion>
    9. exclusions>
    10. dependency>

    log4j2.xml

    在resource下建立文件 ,直接粘贴

     

    1. <configuration monitorInterval="5">
    2. <Properties>
    3. <Property name="pattern">%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c{1}:%L -%m%nProperty>
    4. <Property name="displayName">CeipageServerProperty>
    5. <property name="FILE_PATH">E://Ceinetproperty>
    6. <property name="FILE_NAME">CeipageServerproperty>
    7. Properties>
    8. <Appenders>
    9. <Console name="console" target="SYSTEM_OUT" follow="true">
    10. <PatternLayout pattern="${pattern}"/>
    11. <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
    12. Console>
    13. <File name="error" fileName="${FILE_NAME}_ERROR.log" append="true">
    14. <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
    15. <PatternLayout pattern="${pattern}"/>
    16. File>
    17. <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}_INFO.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
    18. <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
    19. <PatternLayout pattern="${pattern}"/>
    20. <Policies>
    21. <TimeBasedTriggeringPolicy interval="1"/>
    22. <SizeBasedTriggeringPolicy size="10MB"/>
    23. Policies>
    24. <DefaultRolloverStrategy max="30"/>
    25. RollingFile>
    26. <RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}_ERROR.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
    27. <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
    28. <PatternLayout pattern="${pattern}"/>
    29. <Policies>
    30. <TimeBasedTriggeringPolicy interval="1"/>
    31. <SizeBasedTriggeringPolicy size="10MB"/>
    32. Policies>
    33. <DefaultRolloverStrategy max="30"/>
    34. RollingFile>
    35. Appenders>
    36. <Loggers>
    37. <Root level="INFO">
    38. <AppenderRef ref="console">AppenderRef>
    39. <AppenderRef ref="error">AppenderRef>
    40. <AppenderRef ref="RollingFileInfo">AppenderRef>
    41. <AppenderRef ref="RollingFileError">AppenderRef>
    42. Root>
    43. Loggers>
    44. configuration>

     这里面的配置我拷了好几个文章然后改吧改吧整合的

     这里注意几个地方,根据自己情况修改

    1. FILE_PATH,这个是日志输出的磁盘路径,这个跟据你以后部署windows还是linux,路径需要搞对
    2. FILE_NAME,这个名不说了,有注释的,就是生成的文件名,肯定换成自己的啊
    3. 里面的console,有个level等级,看你要控制台输出的日志等级了,等级这玩意会生成大于你当前级别的全部级别(OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL),举个例子你写的是error,那么输出的就是off和fatal和error,一般情况都写info
    4. 测试用的,打包后用不上了,这个会在你项目目录里生成日志文件
    5. 这个是主要的,部署后会根据这里面的配置生成log文件,就是我截图那个效果图,一个级别写一个,我这里面只写了INFO和ERROR级别的,需要其他级别的复制一个然后改吧改吧就行
    6. 里面的ref对应上面配置的name,得对应上哦要不然不输出,尤其对应RollingFile的name

    LoggerUtil.java

    这个是我们自己写的log工具类,发现2代里调用log改成LogManager了。 这里面我们做了调用类的处理,可以不用像以前似的每个类里都得getLogger(XXXX.class)了

    这个不一定非得用我们的,自己有封装的更好

    1. package com.cei.utils;
    2. import org.apache.logging.log4j.LogManager;
    3. import org.apache.logging.log4j.Logger;
    4. import sun.reflect.Reflection;
    5. import java.util.Date;
    6. public class LoggerUtil {
    7. private static boolean isLog = true;
    8. private static Logger logger = null;
    9. public static void setLogger(boolean isLog) {
    10. LoggerUtil.isLog = isLog;
    11. }
    12. public static void setLog(Logger logger) {
    13. LoggerUtil.logger = logger;
    14. }
    15. public static void setLogger(Logger logger) {
    16. LoggerUtil.logger = logger;
    17. }
    18. public static void debug(Object msg) {
    19. if (isLog) {
    20. if (logger == null) {
    21. StackTraceElement[] stackTraceElement = Thread.currentThread().getStackTrace();
    22. if (stackTraceElement.length > 3) {
    23. logger = LogManager.getLogger(stackTraceElement[2].getClassName());
    24. logger.debug("调用者类名" + stackTraceElement[2].getClassName());
    25. } else {
    26. logger = LogManager.getLogger(Reflection.getCallerClass(2).getName());
    27. logger.debug("调用者类名" + Reflection.getCallerClass(2).getName());
    28. }
    29. }
    30. logger.debug(new Date() + " " + msg);
    31. }
    32. }
    33. public static void info(Object msg) {
    34. if (isLog) {
    35. if (logger == null) {
    36. StackTraceElement[] stackTraceElement = Thread.currentThread().getStackTrace();
    37. if (stackTraceElement.length > 3) {
    38. logger = LogManager.getLogger(stackTraceElement[2].getClassName());
    39. logger.debug("调用者类名" + stackTraceElement[2].getClassName());
    40. } else {
    41. logger = LogManager.getLogger(Reflection.getCallerClass(2).getName());
    42. logger.debug("调用者类名" + Reflection.getCallerClass(2).getName());
    43. }
    44. }
    45. logger.info(new Date() + " " + msg);
    46. }
    47. }
    48. public static void warn(Object msg) {
    49. if (isLog) {
    50. if (logger == null) {
    51. StackTraceElement[] stackTraceElement = Thread.currentThread().getStackTrace();
    52. if (stackTraceElement.length > 3) {
    53. logger = LogManager.getLogger(stackTraceElement[2].getClassName());
    54. logger.debug("调用者类名" + stackTraceElement[2].getClassName());
    55. } else {
    56. logger = LogManager.getLogger(Reflection.getCallerClass(2).getName());
    57. logger.debug("调用者类名" + Reflection.getCallerClass(2).getName());
    58. }
    59. }
    60. logger.warn(new Date() + " " + msg);
    61. }
    62. }
    63. public static void error(Object msg) {
    64. if (isLog) {
    65. if (logger == null) {
    66. StackTraceElement[] stackTraceElement = Thread.currentThread().getStackTrace();
    67. if (stackTraceElement.length > 3) {
    68. logger = LogManager.getLogger(stackTraceElement[2].getClassName());
    69. logger.debug("调用者类名" + stackTraceElement[2].getClassName());
    70. } else {
    71. logger = LogManager.getLogger(Reflection.getCallerClass(2).getName());
    72. logger.debug("调用者类名" + Reflection.getCallerClass(2).getName());
    73. }
    74. }
    75. logger.error(new Date() + " " + msg);
    76. }
    77. }
    78. public static void fatal(Object msg) {
    79. if (isLog) {
    80. if (logger == null) {
    81. StackTraceElement[] stackTraceElement = Thread.currentThread().getStackTrace();
    82. if (stackTraceElement.length > 3) {
    83. logger = LogManager.getLogger(stackTraceElement[2].getClassName());
    84. logger.debug("调用者类名" + stackTraceElement[2].getClassName());
    85. } else {
    86. logger = LogManager.getLogger(Reflection.getCallerClass(2).getName());
    87. logger.debug("调用者类名" + Reflection.getCallerClass(2).getName());
    88. }
    89. }
    90. logger.fatal(new Date() + " " + msg);
    91. }
    92. }
    93. }

     还有就是我们是类似抓异常那种线程抓类名,而不是用的这个

     这个有过时的注解了,不是不能用,但是怕有问题就没用

    调用

    调用就简单了,上面都配好后 ,随便调

     

  • 相关阅读:
    区块链 - 各个国家Web3的现状与趋势
    P1219 [USACO1.5] 八皇后 Checker Challenge
    ES6 Generator 函数
    《陈零九的奇幻世界》NFT 系列来啦!
    2.YOLOv1
    Spring系列18:Resource接口及内置实现
    Spring Boot工程开发流程
    神经网络控制系统设计,神经网络技术及其应用
    git stash详解
    基于ECS搭建个人网盘
  • 原文地址:https://blog.csdn.net/qq_37241221/article/details/126121863