Maven多logback.xml问题

问题

    这两天遇到一个很神奇的问题,手上的一个项目日志打印异常,我在resources目录下放了logback.xml但是在linux上却不生效,如果本地直接用IDEA启动时生效的,然后网上查出一堆关于logback.xml该怎么配之类的,该放在那里答案。如果你是第一次配这种东西,可能是不小心改错了,但这明显不是我要的答案。

分析

    项目结构是采用的springboot结构,但是由于项目里是调度程序,在linux通过crontab来进行调度,所以部署到linux时,打成了jar包,通过shell执行java -jar xxx.java来启动程序的。
    检查确认完不是各种粗心造成的问题之后,把眼观聚焦到了logback本地有效,但部署到linux上却不生效了这一点上,不同环境上效果不同,是不是由于编译部署方式不同造成的,所以把目光转向了编译部署工具(maven)上。看了pom.xml中的打包编译配置:

                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>

                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>

使用的是这两个插件,是将项目打成了jar包,同时把当前项目的其他依赖jar包也都复制到项目本身的jar所在的目录,也就是所有jar包都在同一目录下。而本地通过IDEA启动时,都是按照springboot的层次结构编译执行的,而springboot这种层次结构里,依赖jar包的层次是比项目本身的入口更低一层。而本地有效,maven编译后在linux上无效了,是不是因为其他jar包里还有一个logback.xml文件,当所有jar包都在同一层次的时候,应用去读了别的jar包里的logback.xml呢?
    为了验证这一点,我将linux上那个目录下的jar包全部解压出来,然后一搜索,果然在另外一个jar包还有一个logback.xml。其实想发现这个问题,还有另外一个方法,就是看日志,由于logback.xml不生效,日志全部都打印到了控制台上,我们可以通过./xxx.sh > test.log,将控台上的日志打印进文件中,然后打开文件,最上面我们就可以看到logback的加载日志:

10:56:46,765 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
10:56:46,766 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
10:56:46,766 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [jar:file:/app/uttf/lib/sadk-kit-1.0.0.jar!/logback.xml]
10:56:46,767 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs multiple times on the classpath.
10:56:46,767 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [jar:file:/app/uttf/lib/sadk-kit-1.0.0.jar!/logback.xml]

就可以很清晰的看到logback到底加载了哪一个配置文件了。

尝试解决方案

    知道了产生原因,但是解决起来依旧一波三折,一开始以为可以通过在springboot的配置文件中来指定路径,网上也搜到了答案,但是换了好几个参数,试验下来并没有效果,后来发现,logback的加载是早于spring的,比如我们看日志的时候,最上级就是logback,而spring还要往后一些,所以你在spring里配logback的配置文件路径毫无意义。

    后来换了个思路,能不能通过maven,在打包的时候把另外一个logback.xml文件给踢出去,网上也搜到了一些资料,如下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <excludes>
            <exclude>**/logback.xml</exclude>
        </excludes>

        <!-- 下面还有一些其他无关的编译的配置,就不显示了 -->
    </configuration>
</plugin>

通过这样的方式剔除,事实证明也是无效的,反而把我自己的logback.xml个剔除了,所以这种剔除应该是剔除自己当前项目中的配置文件的,对于依赖jar包中的配置文件是无能为力的。

正确解决方案

    既然无法删除,还是只能靠配置正确的路径来解决,最后找到了通过jvm增加logback.configurationFile配置来解决,一种通过在启动参数中加入-Dlogback.configurationFile=file path/logback.xml,另一种是通过在代码中增加System.setProperty(key,value)来解决。后来进行了尝试,还是没有效果,后来查日志发现了问题,里面有一串警告大概意思是,spring项目中使用logging.config替代logback.configurationFile,然后尝试了一下,得以解决。这里是通过代码实现的:

    static {
        System.setProperty("logging.config","jar:file:***/logback.xml");
    }

***表示路径,这段静态块需要写在最前面,至少在spring前面,在尝试解决中有说到过,logback加载的很早,拟配置晚了就没意义了,用这个配置有一个难点是路径到底填什么,如果大家要使用的话,各自的项目需要自己斟酌一下的。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在 logback-spring.xml 配置 filebeat,需要进行以下步骤: 首先,确保已经在系统中安装并配置好了 filebeat,可以通过下载官方网站提供的 filebeat 安装包并按照提示进行安装,然后在 filebeat.yml 文件中配置好需要收集的日志文件路径和目标 Logstash 或 Elasticsearch 服务器的地址等信息。 接下来,在 logback-spring.xml 文件中进行如下配置。 1. 导入 logstash-logback-encoder 包,可以通过 Maven 或其他方式引入依赖。例如: ```xml <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>6.6</version> </dependency> ``` 2. 在 logback-spring.xml 文件中添加 Appender,配置 filebeat 作为输出目标。例如: ```xml <appender name="FILEBEAT" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/path/to/log/file.log</file> <encoder class="net.logstash.logback.encoder.LogstashEncoder" /> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/path/to/log/file.log.%d{yyyy-MM-dd}.gz</fileNamePattern> </rollingPolicy> </appender> ``` 3. 将 Appender 添加到适当的 Logger 中,例如: ```xml <logger name="com.example.myLogger" level="info"> <appender-ref ref="FILEBEAT" /> </logger> ``` 4. 最后,确保在 logback-spring.xml 文件的配置末尾添加 `<root>` 元素,将级别设置为 `info`,并引用 filebeat appender,以便所有的日志都被发送到 filebeat。例如: ```xml <root level="info"> <appender-ref ref="FILEBEAT" /> </root> ``` 完成上述步骤后,重新启动应用程序,日志将会通过 logback 的配置写入到指定的日志文件中,然后由 filebeat 负责将日志发送到配置的目标服务器。 ### 回答2: logback是一个流行的Java日志组件,而filebeat是一个开源的日志收集工具,可以将日志发送到指定的目标。 在logback-spring.xml中配置filebeat可以实现将应用程序的日志文件发送到filebeat所在的服务器,然后由filebeat将这些日志发送到配置的目标。 首先,在logback-spring.xml中添加以下的appender配置: <appender name="filebeat" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/path/to/log/file.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 配置日志文件的滚动策略,可以按照文件大小或时间进行滚动 --> <fileNamePattern>/path/to/log/file-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>10MB</maxFileSize> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> 然后,在logback-spring.xml中添加以下的logger配置: <logger name="com.example" level="DEBUG" additivity="false"> <!-- 绑定之前定义的appender --> <appender-ref ref="filebeat"/> </logger> 这样配置之后,将会将com.example包下的日志输出到filebeat所指定的日志文件中。 最后,确保filebeat的配置文件中指定了相应的输入和输出,以正确地收集和发送日志文件的内容。 需要注意的是,配置的路径和文件名需要根据实际情况进行修改。配置完成后,重新启动应用程序,就可以开始将日志发送到filebeat了。 ### 回答3: 在使用logback-spring.xml配置filebeat时,我们需要确保以下几点: 1. 首先,我们需要确定filebeat的安装路径,并在logback-spring.xml文件中配置相应的appender。可以通过以下示例配置一个appender: ```xml <appender name="FILEBEAT" class="ch.qos.logback.core.FileAppender"> <file>/path/to/log/file.log</file> <append>true</append> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> ``` 在上述示例中,我们配置了一个名为FILEBEAT的appender,并指定了日志文件的路径。我们还可以根据需求设置是否追加内容以及日志的格式。 2. 之后,我们需要在logback-spring.xml中添加一个root logger,并将appender与root logger关联起来。以下是一个示例配置: ```xml <root level="info"> <appender-ref ref="FILEBEAT"/> </root> ``` 在上述示例中,我们设置root logger的日志级别为info,并将之前配置的FILEBEAT appender与root logger关联起来,以确保日志会被发送到filebeat。 3. 最后,我们需要将filebeat配置文件指向logback-spring.xml。我们可以通过在filebeat配置文件中使用如下示例配置来实现: ```yaml filebeat.inputs: - type: log enabled: true paths: - /path/to/log/file.log output.logstash: hosts: ["localhost:5044"] index: "logback" logging.level: debug logging.to_files: true logging.files: path: /var/log/filebeat name: filebeat keepfiles: 7 ``` 在上述示例配置中,我们将filebeat的输入类型设置为log,并指定需要监控的日志文件路径。同时,我们还指定了logback作为输出类型,并指定了logstash的主机和索引名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值