已创建 Log4j2 文件但未写入日志

Log4j2 file created but not log written

我在springboot中使用了log4j2,日志文件已经创建但是日志没有写入文件。

log4j2.properties

name=PropertiesConfig
property.filename = /export/home/apps/logs
appenders = console, file

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n

appender.file.type = File
appender.file.name = LOGFILE
appender.file.fileName=${filename}/app-frontend.log
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n

loggers=file
logger.file.name=guru.springframework.blog.log4j2properties
logger.file.level = debug
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref = LOGFILE

rootLogger.level = debug
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT

pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
    </dependencies>

使用记录器的方法

private static Logger logger = LogManager.getLogger();

    @RequestMapping(value="/check", method = RequestMethod.GET)
    public String healthCheck() {

        logger.debug("Health-check invoked");

        return "Hey, I am fine";
    }

上面我已经提到了我使用过的代码。还是找不到办法解决。日志甚至没有出现在控制台中。

在 spring-boot 中使用“log4j2.properties”进行配置有一定的限制。 Log4J 2 最初发布时不支持通过属性文件进行配置。从 Log4J 2.4 开始,再次添加了对属性文件的支持,但是 the documentation

中提到的 syntax.As 完全不同

As of version 2.4, Log4j now supports configuration via properties files. Note that the property syntax is NOT the same as the syntax used in Log4j 1.

As of version 2.6, this list of identifiers is no longer required as names are inferred upon first usage, however if you wish to use more complex identifies you must still use the list. If the list is present it will be used.

从 spring 引导版本 1.4.0 开始,使用的 log4j2 api 版本是 2.6.2。请注意,spring-boot 使用 slf4j api 来支持多个底层日志记录框架。在不处理 slf4j 绑定的类路径依赖性的情况下为 log4j2 使用基于属性的配置时似乎存在问题。

使用基于 XML(或 yaml/json)的配置来实现相同的目的并启用 log4j2 能够使用的所有功能是有意义的。

这是相同属性的基于 xml 的配置。

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">
<Properties>
    <Property name="filename">export/home/apps/logs</Property>
</Properties>
<Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
    </Console>
    <File name="LOGFILE"
        fileName="${filename}/app-frontend.log">
        <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
    </File>
</Appenders>
<Loggers>

    <Logger name="guru.springframework.blog.log4j2properties" level="debug">
        <AppenderRef ref="LOGFILE"
            level="debug" />
    </Logger>
    <Root level="debug">
        <AppenderRef ref="STDOUT"/>
    </Root>
</Loggers>

我尝试了多种方法,但 log4j2.properties 不起作用。我尝试了这么多版本的 spring-boot(最高 1.4.3)和 log4j2 组合并得出结论

  • Log4j2 - 2.7 工作正常,但 spring-boot 直到版本 (1.4.x).
  • 才随 log4j2-2.7 一起提供
  • 不要去log4j2.properties使用springboot组合进行日志记录
  • 最好将 log4j2.yml 与此组合一起使用,因为这些天极客对使用 xml 不感兴趣。

这是我如何实现的示例。

build.gradle

依赖项{

[
    "org.springframework:spring-context",
    "org.springframework.boot:spring-boot-starter-web",
    "org.springframework.boot:spring-boot-starter-data-jpa",
    "org.springframework.boot:spring-boot-starter-test",
    "org.springframework:spring-context-support:4.1.6.RELEASE"
].each { dep -> compile(dep) {
        exclude module: "spring-boot-starter-logging"
    }
}
compile("org.springframework.boot:spring-boot-starter-log4j2")
compile ('org.apache.logging.log4j:log4j-api:2.6.2')
compile ('org.apache.logging.log4j:log4j-core:2.6.2')   
compile ('org.apache.logging.log4j:log4j-slf4j-impl:2.6')
compile ('org.hibernate:hibernate-entitymanager:5.2.2.Final')
compile ('org.hibernate:hibernate-core:5.2.2.Final')
compile ('org.hibernate:hibernate-java8:5.2.2.Final')
compile 'mysql:mysql-connector-java:5.1.31'
compile 'org.apache.commons:commons-lang3:3.0'
compile 'org.freemarker:freemarker:2.3.20'
//compile 'org.apache.velocity:velocity:1.7'
compile 'commons-dbcp:commons-dbcp:1.4'
compile 'javax.servlet:jstl:1.2'
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.8.5'
testCompile 'junit:junit:4.12'
providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper'

}

log4j2.yml

将此文件放入 src->main->resources

configuration:
  name: Default
  properties:
    property:
    - name: log-path
      value: c:\logs
    - name: archive
      value: ${log-path}/archive
  appenders:
    Console:
      PatternLayout:
        pattern: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n'
      name: Console-Appender
      target: SYSTEM_OUT
    File:
      PatternLayout:
        pattern: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n'
      fileName: ${log-path}/amc.log
      name: File-Appender
    RollingFile:
      DefaultRolloverStrategy:
        max: '30'
      PatternLayout:
        pattern: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n'
      Policies:
        SizeBasedTriggeringPolicy:
          size: 1 KB
      fileName: ${log-path}/rollingfile.log
      filePattern: ${archive}/rollingfile.log.%d{yyyy-MM-dd-hh-mm}.gz
      name: RollingFile-Appender
  loggers:
    logger:
      additivity: 'false'
      appender-ref:
      - level: info
        ref: Console-Appender
      - level: info
        ref: File-Appender
      - level: info
        ref: RollingFile-Appender
      level: debug
      name: <your package>
    root:
      appender-ref:
        ref: File-Appender
      level: info

请将您的 logger.file.name 重命名为您自己的 属性。

Logger logger = LogManager.getLogger("My_logger");

在log4j2.xml中我们应该说出getLogger("String")的名称来监听和写入文件。

<Logger name ="My_logger" level="debug"> 

终于得到解决方案: 让你的 logger.file.appenderRefs 成为 root logger

rootLogger.appenderRefs = file, stdout
rootLogger.appenderRef.file.ref = LOGFILE


rootLogger.level = debug
rootLogger.appenderRef.stdout.ref = STDOUT

这绝对有用!!但我无法限制文件大小。甚至超过了 log4j2 中默认文件最大大小 (10M) 的限制。

就我而言,我必须添加下一行:

rootLogger.appenderRef.file.ref = 日志文件

还有评论存在: appender.file.fileName

////////////////////////////////////////// /// 配置 Log4j2.xml ////////////////////////////////////////////////////

property.filename = logs
appenders = console, file

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n

appender.file.type = File
appender.file.name = LOGFILE
appender.file.fileName = ${filename}/application.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} -%msg%n

loggers = file
logger.file.name = guru.springframework.blog.log4j2properties
logger.file.level = debug
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref = LOGFILE

rootLogger.level = debug
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT

rootLogger.appenderRef.file.ref = LOGFILE

////////////////////////////////////////// /// 配置 Log4j2.xml(结束) ////////////////////////////////////////////////////

对我有用。

对不起我的英语。 问候