近日自己在写springboot项目时,发现使用log4j作为日志输入工具时,没有正常生成日志文件,有点莫名其妙。上某度查了下,发现各种版本解决方案。现在记录下自己的问题以及解决方案,以供日后参考。

## 问题版本

### pom文件

<modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.test</groupId>
    <artifactId>epark</artifactId>
    <version>0.0.1</version>
    <name>epark</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

### log4j日志文件

### 设置###
log4j.rootLogger = INFO,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D:/logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
log4j.appender.D.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.D.encoding=UTF-8
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = D:/logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
log4j.appender.E.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.E.encoding=UTF-8

以上配置好后就是正常的springboot启动,但是请求地址发现,控制台有打印日志,日志文件就是没生成出来。

## 解决方案

### 修改pom配置文件

网上解释:因为SpringBoot自带了一个spring-boot-starter-logging,默认是用他来打印日志信息的,所以就算依赖里添加了log4j,而且也将配置文件放在对应位置也不会生效!所以要将spring的这个依赖排除。

修改代码如下

<!-- 排除内部的日志部分 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</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-log4j</artifactId>
    <version>1.3.8.RELEASE</version>
</dependency>
近日自己在写springboot项目时,发现使用log4j作为日志输入工具时,没有正常生成日志文件,有点莫名其妙。上某度查了下,发现各种版本解决方案。现在记录下自己的问题以及解决方案,以供日后参考。## 问题版本### pom文件&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt; &lt;parent&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&g...
Plumelog一个简单易用的java分布式 日志 组件。支持百亿级别, 日志 从搜集到查询,不用去 文件 翻阅 日志 方便快捷,支持查询一个调用链的 日志 ,支持链路追踪,查看调用链耗时情况,在分布式系统 也可以查询关联 日志 ,能够帮助快速定位问题,简单易用, 没有 代码入侵,查询界面友好,高效,方便,只要你是java系统,不要做任何项目改造,接入直接 使用 日志 不落本地磁盘,无需关心 日志 占用应用服务器磁盘问题,觉得项目好用帮忙点个星星,您的star是我们前进的动力。 Plumelog功能介绍: 1、无入侵的分布式 日志 系统,基于 log4j log4j 2、logback搜集 日志 ,设置链路ID,方便查询关联 日志 2、基于elasticsearch作为查询引擎 3、高吞吐,查询效率高 4、全程不占应用 程序 本地磁盘空间,免维护;对于项目透明,不影响项目本身运行 5、无需修改老项目,引入直接 使用 ,支持dubbo,支持springcloud Plumelog架构: plumelog-core:核心组件包含 日志 搜集端,负责搜集 日志 并推送到kafka,redis等队列 plumelog-server:负责把队列 日志 日志 异步写入到elasticsearch plumelog-ui:前端展示, 日志 查询界面 plumelog-demo:基于 springboot 使用 案例 Plumelog 使用 方法: 自己编译安装如下 前提:kafka或者redis 和 elasticsearch(版本6.8以上最好) 自行安装完毕,版本兼容已经做了,理论不用考虑ES版本 maven deploy -DskipTests 上传包到自己的私服 私服地址到plumelog/pom.xml改      UTF-8      http://172.16.249.94:4000
2、路径错误 当我们配置 log4j .appender.logfile.File=../logs/vpn.log为相对路径的时候,启动tomcat只能在bin目录下shstartup.sh,而不能在其他目录下启动,如在tomcat目录下./bin/startup.sh启动; 如果 log4j .appender.logfile.Fi... log4j .logger.com.mchange=ERROR,A2 log4j .logger.org=ERROR,A2 log4j .logger.httpclient.wire=ERROR,A2 log4j .log <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter- log4j 2</artifactId> </dependency> 2. 在项目的 resources 目录下创建 log4j 2.xml 文件 ,并配置 log4j 2 的相关参数,如: <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="Console"/> </Root> <Logger name="org.springframework.boot" level="info"/> </Loggers> </Configuration> 3. 在代码 使用 log4j 2 记录 日志 ,例如: private static final Logger logger = LogManager.getLogger(YourClassName.class); logger.info("This is a log4j 2 log message."); 在项目启动后, log4j 2 就会根据配置 文件 的参数,将 日志 信息记录到控制台或其他地方。