Java 弹簧原木不是特定于机器的

Java 弹簧原木不是特定于机器的,java,tomcat,java-8,slf4j,logback,Java,Tomcat,Java 8,Slf4j,Logback,我使用的是一个springmaven-tomcat8java8堆栈。我面临的问题是,在某些机器上无法生成日志。我正在使用slf4j logback组合进行日志记录。当我试图将堆栈从java7移动到java8时,问题就出现了 这是我的logback.xml: <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="dal" class="ch.qos.log

我使用的是一个
springmaven-tomcat8java8
堆栈。我面临的问题是,在某些机器上无法生成日志。我正在使用
slf4j logback
组合进行日志记录。当我试图将堆栈从
java7
移动到
java8
时,问题就出现了

这是我的
logback.xml:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <appender name="dal"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/var/log/dal/dal.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>/var/log/dal/dal-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <!-- keep 30 days' worth of history -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>[%d{HH:mm:ss.SSS} %thread %-5level %C:%L] %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{HH:mm:ss.SSS} %thread %-5level %C:%L] %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="email-appender" class="ch.qos.logback.classic.net.SMTPAppender">
        <to></to>
        <from></from>
        <subject>API Logs - Error while sending notification</subject>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>[%d{HH:mm:ss.SSS} %thread %-5level %C:%L] %msg%n</pattern>
        </layout>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="dal" />
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
MVN:

Tomcat:

apache-tomcat-8.0.15 $ bin/version.sh 
Using CATALINA_BASE:   /opt/apache-tomcat-8.0.15
Using CATALINA_HOME:   /opt/apache-tomcat-8.0.15
Using CATALINA_TMPDIR: /opt/apache-tomcat-8.0.15/temp
Using JRE_HOME:        /usr/lib/jvm/java-8-oracle/
Using CLASSPATH:       /opt/apache-tomcat-8.0.15/bin/bootstrap.jar:/opt/apache-tomcat-8.0.15/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.15
Server built:   Nov 2 2014 19:25:20 UTC
Server number:  8.0.15.0
OS Name:        Linux
OS Version:     3.2.0-74-generic
Architecture:   amd64
JVM Version:    1.8.0_25-b17
JVM Vendor:     Oracle Corporation
sysadmin@ip-172-30-0-26:/opt/apache-tomcat-8.0.15$ sudo bin/version.sh 
Using CATALINA_BASE:   /opt/apache-tomcat-8.0.15
Using CATALINA_HOME:   /opt/apache-tomcat-8.0.15
Using CATALINA_TMPDIR: /opt/apache-tomcat-8.0.15/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /opt/apache-tomcat-8.0.15/bin/bootstrap.jar:/opt/apache-tomcat-8.0.15/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.15
Server built:   Nov 2 2014 19:25:20 UTC
Server number:  8.0.15.0
OS Name:        Linux
OS Version:     3.13.0-29-generic
Architecture:   amd64
JVM Version:    1.8.0_25-b17
JVM Vendor:     Oracle Corporation
爪哇:

许可:

ls -al /var/log/dal/
total 72
drwxrwxrwx 2 root root  4096 Dec 22 19:50 .
drwxrwxrwx 4 root root  4096 Oct 21 09:47 ..
-rw-r--r-- 1 root root 60925 Dec 22 20:38 dal.log
sysadmin@ip-172-30-0-26:/opt/apache-tomcat-8.0.15$ ls -al /var/log/dal/
total 8
drwxrwxrwx 2 root root 4096 Dec 22 19:48 .
drwxrwxrwx 4 root root 4096 Dec 22 19:48 ..
以下是我没有获得任何日志的服务器的详细信息: 操作系统:

MVN:

Tomcat:

apache-tomcat-8.0.15 $ bin/version.sh 
Using CATALINA_BASE:   /opt/apache-tomcat-8.0.15
Using CATALINA_HOME:   /opt/apache-tomcat-8.0.15
Using CATALINA_TMPDIR: /opt/apache-tomcat-8.0.15/temp
Using JRE_HOME:        /usr/lib/jvm/java-8-oracle/
Using CLASSPATH:       /opt/apache-tomcat-8.0.15/bin/bootstrap.jar:/opt/apache-tomcat-8.0.15/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.15
Server built:   Nov 2 2014 19:25:20 UTC
Server number:  8.0.15.0
OS Name:        Linux
OS Version:     3.2.0-74-generic
Architecture:   amd64
JVM Version:    1.8.0_25-b17
JVM Vendor:     Oracle Corporation
sysadmin@ip-172-30-0-26:/opt/apache-tomcat-8.0.15$ sudo bin/version.sh 
Using CATALINA_BASE:   /opt/apache-tomcat-8.0.15
Using CATALINA_HOME:   /opt/apache-tomcat-8.0.15
Using CATALINA_TMPDIR: /opt/apache-tomcat-8.0.15/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /opt/apache-tomcat-8.0.15/bin/bootstrap.jar:/opt/apache-tomcat-8.0.15/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.15
Server built:   Nov 2 2014 19:25:20 UTC
Server number:  8.0.15.0
OS Name:        Linux
OS Version:     3.13.0-29-generic
Architecture:   amd64
JVM Version:    1.8.0_25-b17
JVM Vendor:     Oracle Corporation
爪哇:

许可:

ls -al /var/log/dal/
total 72
drwxrwxrwx 2 root root  4096 Dec 22 19:50 .
drwxrwxrwx 4 root root  4096 Oct 21 09:47 ..
-rw-r--r-- 1 root root 60925 Dec 22 20:38 dal.log
sysadmin@ip-172-30-0-26:/opt/apache-tomcat-8.0.15$ ls -al /var/log/dal/
total 8
drwxrwxrwx 2 root root 4096 Dec 22 19:48 .
drwxrwxrwx 4 root root 4096 Dec 22 19:48 ..
另一件值得注意的事情是,当我执行
System.out.println(“msg”)
时,
“msg”
会进入两台服务器上的
catalins.out
。如果我在生成日志的机器上更改
/var/log/dal
的权限,日志仍然会在
catalina.out
中生成。所以这不应该与权限相关

我曾尝试将war文件从一台服务器复制到另一台服务器,但没有发现任何行为变化。因此,这不应该与
maven
相关。Tomcat和Java版本是相同的。这可能与操作系统有关吗


更新:当我使用
mvn clean tomcat7:run运行我的应用程序时,我会在所有服务器上获取日志。所以这个问题似乎和tomcat8有关。我甚至尝试过将tomcat8从一台服务器复制到另一台服务器。它没有帮助。

请确保类路径上没有其他绑定(例如,在tomcat中)。

这是slf4j在类路径中标识多个绑定的情况。在这种情况下,slf4j几乎选择绑定。在我的例子中,发生这种情况是因为通过
solr-core
可以使用
slf4j-log4j12
绑定。要删除此项,我必须明确排除此项:

    <dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-core</artifactId>
        <version>${solr.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

org.apache.solr
solr核
${solr.version}
org.slf4j
slf4j-log4j12

两个问题-如果在未生成日志的机器上将jdk降级为7,日志是否会显示?您能否验证运行tomcat的用户是否拥有日志文件夹中的权限,即/var/log/dal/dal.log?当整个堆栈在java7上运行时,到处都会生成日志。。。但我没有尝试降级。。。我会尽快让你知道。。。更新问题本身中的权限部分我们也从tomcat7迁移到了tomcat8以及java8迁移。。。所以,当我尝试还原到java7时,日志没有出现java7-tomcat8组合,而是开始使用java7-tomcat7组合生成。。。但正如问题中显而易见的那样,tomcat版本在两台服务器上都是相同的。为了缩小问题的范围,我建议尝试两件事——运行一个只有slf4j和logback库的独立应用程序(在java7和java8上)。本测试中没有tomcat。下一步是试用java8-tomcat7组合,确认问题是Tomcat8迁移,而不是java8。@AndyDufresne我已经用一些细节更新了问题。。。我不能检查java8-tomcat7组合,因为我与java7一起使用的tomcat7版本与java8有一些问题,因此我决定转到tomcat8。你不同意slf4j-jas对此的说法是的,我不同意。我认为应该如所述,我不认为这两种情况是相同的slf4j api jar和不同的impl jar之间的桥梁是根据org.slf4j.impl.StaticLoggerBinder实现的。每个impl jar中都有一个全名为的类,该类始终包含相应的内容,并以正常方式访问(不涉及反射或自定义类加载)。我想这正是我之前评论中提到的情况。
sysadmin@ip-172-30-0-26:/opt/apache-tomcat-8.0.15$ ls -al /var/log/dal/
total 8
drwxrwxrwx 2 root root 4096 Dec 22 19:48 .
drwxrwxrwx 4 root root 4096 Dec 22 19:48 ..
    <dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-core</artifactId>
        <version>${solr.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency>