我不想使用standalone.xml或CLI配置日志记录,因为它需要为同事提供额外的步骤才能获得可用的开发环境.我希望使用我们的源代码签入这些配置文件,并在部署时自动应用.
使用JBoss 5,可以在jboss-log4j.xml中声明日志记录.JBoss 7中是否还有这个文件的等价物?
我们想使用slf4j和logback.
我试图从Spring MVC中的控制器登录但没有出现.我正在使用SLF4J和logback.我设法从主类登录,但在将其作为Web应用程序后,它不会记录.
我认为它会起作用,因为SL4JF和Logback在类路径中.
@Controller
@RequestMapping(value = "/cars")
public class CarController {
private Logger logger = LoggerFactory.getLogger(CarController.class);
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public Map<String, String> newCar() {
logger.info("new car");
// more code
return map;
}
}
Run Code Online (Sandbox Code Playgroud)
logback.xml
<configuration scan="true">
<property name="LOG_DIR" value="/My/User/Desktop"/>
<!--Loggers-->
<logger name="my.company" level="DEBUG"/>
<!--Root logger-->
<root level="debug">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE_ROLLER"/>
</root>
<!--Appenders-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE_ROLLER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/mylog.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>mylog.%d{yyyy-mm-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} …Run Code Online (Sandbox Code Playgroud) 我用slf4j-logback日志创建了一个简单的Web应用程序.我使用以下配置将日志语句打印到mylog.log文件.
<configuration>
<appender name="fileAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${catalina.base}/logs/mylog.log</File>
<encoder>
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n
</Pattern>
</encoder>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="fileAppender" />
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
以上工作正常.
我遇到了一个logger元素
<logger name="mylog" additivity="false">
<level value="DEBUG" />
<appender-ref ref="fileAppender" />
</logger>
Run Code Online (Sandbox Code Playgroud)
这个logger元素有什么用?我的第一个配置工作正常会有什么不同吗?
我正在JUnit测试中测试在某些情况下会引发自定义错误,使用@Test注释,一切顺利.
@Test(expected = MyCustomException.class)
public void MyTest(){
...
}
Run Code Online (Sandbox Code Playgroud)
但是,在我的代码中,当我遇到这样的错误时,我会以这样的方式使用记录器(slf4j):
catch (IllegalArgumentException e) {
LOG.error("My custom exception occured with {}", inputVar, e);
throw new MyCustomException(inputVar, e);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,行为很好.当我使用maven构建我的应用程序时,所有测试都已完成.完成描述的测试后,测试被标记为已通过,但我的shell中有一个完整的堆栈跟踪,前面有一个大错误.
我的问题如下,有没有办法在运行测试时删除日志(因此不在shell中查看)?
第二个问题是:我是否应该尝试?或者我应该只验证所有测试都通过了,并且在构建应用程序时看到堆栈跟踪和错误时不要担心?(改变主意而不是改变代码)
我对SLF4J很感兴趣,因为它似乎是唯一的Java库(至少我可以解释),它在运行时使用这种所谓的" 动态绑定 "类来定义行为.
通过这个,我的意思是,如果你slf4j-api在编译类路径中包含,你现在可以访问该JAR中包含的所有API类(Loggers和LoggerFactories等),但它们的实际运行时行为是no-op(什么都不做),除非你包含一个运行时类路径上的" SLF4J绑定 ",例如slf4j-simple(将日志语句发送到STDOUT和STDERR),或者slf4j-log4j,然后期望Log4J配置等.
就像我上面所说的,这种类型的动态绑定行为似乎是SLF4J项目所特有的.
我想知道为什么?一般来说,在日志记录之外,哪种场景可以保证这种动态绑定作为解决方案?对我来说,它似乎是经典依赖注入(Spring,Guice)的替代方案,几乎将注入推迟到运行时("JIT")确定运行时类路径上可用的匹配类.
所以我问:这个解决方案是否唯一有理由只解决日志记录问题?如果是这样,为什么?如果没有,那么还有哪些其他问题需要这种方法作为解决方案?
对于这个非常基本的问题我很抱歉,但是我花了很多时间研究它并且无法使它工作: - /我想要的:在INFO级别显示所有记录,但我的应用程序在DEBUG级别.到目前为止,我的设置和理解是:
在我的WildFly中,我使用slf4j进行logback.我没有在所有b/c中配置logback,这是在WildFly配置中完成的.这是我的pom:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是我的记录器配置:
<console-handler name="CONSOLE">
<level name="DEBUG"/>
<formatter>
<named-formatter name="COLOR-PATTERN"/>
</formatter>
</console-handler>
<periodic-rotating-file-handler name="FILE" autoflush="true">
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
<logger category="com.arjuna">
<level name="WARN"/>
</logger>
<logger category="org.apache.tomcat.util.modeler">
<level name="WARN"/>
</logger>
<logger category="org.jboss.as.config">
<level name="DEBUG"/>
</logger>
<logger category="sun.rmi">
<level name="WARN"/>
</logger>
<logger category="jacorb">
<level name="WARN"/>
</logger>
<logger category="org.hibernate">
<level name="INFO"/>
</logger>
<logger category="javax">
<level name="INFO"/>
</logger>
<logger category="com.sample.application" use-parent-handlers="false">
<level name="DEBUG"/>
<handlers> …Run Code Online (Sandbox Code Playgroud) 我查找了类似的问题,但没有一个答案能真正解决问题。我有一个配置为使用slf4j + log4j2的Spring Boot应用程序(在中使用内部log4j2.xml配置src/main/resources)。我将这场战争部署在JBoss EAP(6.4和7)上,可以看到来自JBoss启动的日志跟踪。问题是log4j2附加程序只是不输出任何内容,无论是在控制台上还是在文件上:
在控制台中,仅显示jboss日志日志(我的应用程序跟踪中的每个log.info()都使用jboss日志记录格式)。
一个c:\logs\out.log 是创建的文件,但没有被写在上面。
这些是我所做的事情:
我已经调试并检查了Spring Boot的文件Log4J2LoggingSystem是否正确初始化classpath:log4j2.xml。
我的应用程序使用SLF4J,并且在调试时,我已经看到底层的日志记录实现是JBoss的日志记录,而不是Log4j2
log4j2日志记录在Tomcat上正常工作。
在standalone.xml中,我已删除<extension module="org.jboss.as.logging"/>和<subsystem xmlns="urn:jboss:domain:logging:3.0">块。完成此操作后,控制台上仅打印了一些jboss跟踪(但应用程序log.info()中没有任何跟踪),但是log4j2文件附加器可以正确打印。
如何配置JBoss以支持控制台上应用程序的log4j2.xml打印和文件?
log4j2.xml摘录:
<Configuration status="WARN">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout ...
<RollingFile name="file"
filePattern="'.'%d{yyyy-MM-dd}"
fileName="c:\logs\out.log">
<PatternLayout
pattern="%d{yyyy-MM-dd'T'HH:mm:ss.SSS} - %c{1.} %5p - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="file" />
<AppenderRef ref="console" />
</Logger>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
更新
问题与JBoss管理SLF4J的方式有关:
org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger(PresupuestoController.class);
org.apache.logging.log4j.Logger log4j2Logger …Run Code Online (Sandbox Code Playgroud) 我在帖子中找不到解决方案之后打开这篇文章: 无法加载类"org.slf4j.impl.StaticLoggerBinder"错误
我还在IntelliJ中打开了一个Maven项目,并在tomcat7插件中选择'redeploy'选项后出现以下错误:
SLF4J:无法加载类"org.slf4j.impl.StaticLoggerBinder".SLF4J:默认为无操作(NOP)记录器实现SLF4J:有关更多详细信息,请参阅http://www.slf4j.org/codes.html#StaticLoggerBinder.
在附加的链接中,建议转到File-> Project Structure - > Artifacts并检查错误.这就是我所看到的:
我在pom.xml文件中也有以下依赖项:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
你能帮我找错吗?
我使用下面的appender,我可以看到每小时立即发生回滚.
但我提到了<maxHistory>10天.但我可以看到日志会在每天结束时通过logback自动删除.
但期望是将日志文件保留最多10天.
<appender name="TIME_BASED_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>c:/logs/timeBasedlogFile.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>c:/logs/timeBasedlogFile.%d{yyyy-MM-dd_HH}.log</fileNamePattern>
<maxHistory>10</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
Run Code Online (Sandbox Code Playgroud)
如果我使用每日翻转,那么我可以看到翻转的日志保持了所提到的天数 <maxHistory>
maxHistory只适用于每日翻转吗?
我正在尝试在Windows上的Java 11(jdk-11.0.2)的Spring Boot(2.1.2.RELEASE)中运行一个简单的hello world应用程序。当我使用Maven spring boot插件运行应用程序时,出现以下异常:
Exception in thread "main" java.lang.StackOverflowError
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:408)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
at org.apache.commons.logging.LogAdapter$Slf4jAdapter.createLocationAwareLog(LogAdapter.java:130)
at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:91)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67)
at org.slf4j.impl.JCLLoggerFactory.getLogger(JCLLoggerFactory.java:77)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
at org.apache.commons.logging.LogAdapter$Slf4jAdapter.createLocationAwareLog(LogAdapter.java:130)
at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:91)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67)
at org.slf4j.impl.JCLLoggerFactory.getLogger(JCLLoggerFactory.java:77)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
at org.apache.commons.logging.LogAdapter$Slf4jAdapter.createLocationAwareLog(LogAdapter.java:130)
Run Code Online (Sandbox Code Playgroud)
我有以下Java代码:
@SpringBootApplication
@PropertySource(value = "${url/ELMProperties}", ignoreResourceNotFound = true)
@PropertySource(value = "classpath:version/elm.properties")
//TODO remove the below line once the data source has been configured
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application extends SpringBootServletInitializer
{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(com.test.Application.class);
}
public …Run Code Online (Sandbox Code Playgroud)