我是Scala的新手,并不熟悉Java的最新发展,所以我认为我认为这是一个基本问题.
我正在编写一些Scala代码,并使用ScalaTest和TestNG使用测试夹具进行测试.正在测试的代码使用slf4s执行其日志记录,由logback支持.
在我的'build.sbt'文件中,我有我需要的所有库的依赖项:
scalaVersion := "2.9.1"
// Add test dependencies on scalatest and testng
libraryDependencies ++= Seq("org.scalatest" %% "scalatest" % "1.6.1" % "test", "org.testng" % "testng" % "6.1.1" % "test")
// Use the slf4j logging facade for logging
libraryDependencies += "org.slf4j" % "slf4j-api" % "1.6.3"
//use the slf4j connectors to implement the JCL logging facade in terms of slf4j (which in turn is implemented in terms of logback)
//confused yet?
libraryDependencies += "org.slf4j" % "jcl-over-slf4j" % "1.6.3"
//use logback for …Run Code Online (Sandbox Code Playgroud) 我在我的logback.xml配置文件中这个appender:
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>classpath:addressbookLog.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{dd MMM yyyy;HH:mm:ss} %-5level %logger{36} - %msg%n
</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>classpath:addressbookLog.%i.log.zip</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>10</MaxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>2MB</MaxFileSize>
</triggeringPolicy>
</appender>
Run Code Online (Sandbox Code Playgroud)
所以我指定文件的路径,通过类路径以相对的方式打印日志,但它不起作用,没有创建和写入文件addressbookLog.log.它只适用于像/home/andrea/.../resources/addressbookLog.log这样的绝对路径.您对如何使用classpath有任何想法吗?
我正在尝试以编程方式设置Logback appender路径.(具有FixedWindowRollingPolicy的RollingFileAppender准确)
我这样做是因为我想让我的用户在首选项对话框中设置日志路径(Eclipse RCP)
我尝试过类似的东西,但是我没有改变配置文件中定义的日志路径:
Logger logback_logger = (ch.qos.logback.classic.Logger)LoggerFactory
.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
RollingFileAppender<ILoggingEvent> rfappender =
(RollingFileAppender<ILoggingEvent>)logback_logger.getAppender("FILE");
rfappender.setFile(newFile);
FixedWindowRollingPolicy rollingPolicy =
(FixedWindowRollingPolicy)rfappender.getRollingPolicy();
rollingPolicy.setFileNamePattern(newPattern);
Run Code Online (Sandbox Code Playgroud) 我正在使用slf4j 1.6.2 api jar(也尝试使用1.6.1) - logback版本是0.9.29(核心和经典).我在ubuntu上使用jdk1.6.我收到的例外情况将在下面复制.
Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:112)
at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:471)
at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:427)
at ch.qos.logback.classic.Logger.info(Logger.java:631)
Run Code Online (Sandbox Code Playgroud)
我也收到一条抱怨slf4j绑定不匹配的消息.
"SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6, 1.5.7, 1.5.8, 1.5.9, 1.5.10, 1.5.11]"
Run Code Online (Sandbox Code Playgroud) 在我们的日志文件中,我们发现以下内容
[2012-09-24 00:09:32.590 +0000UTC] ERROR host server1 [] [] somepackage.someclass [] [Unknown] [V3rAqPaDvvAAAAExEXhdWGyh] [pjsQwTGHzxcAAAE5j4YdGvWV] "ThreadName" Some error happened: java.lang.ArrayIndexOutOfBoundsException: null
Run Code Online (Sandbox Code Playgroud)
只有这一行,没有异常堆栈跟踪.
try发生此异常的块是执行使用javassist创建的动态生成的Java字节码.
我想知道两件事:
java.lang.ArrayIndexOutOfBoundsException日期nulllogger.error("message", theException)在catch块内部使用日志挂钩调用,这通常会导致在日志文件中打印完整的堆栈跟踪.我的问题:
什么样的代码可以导致日志输出"java.lang.ArrayIndexOutOfBoundsException:null".我尝试用没有运气的测试程序重现这个.我总是得到像"java.lang.ArrayIndexOutOfBoundsException:Index:3"或类似的东西.
丢失堆栈跟踪的原因可能是此代码是在运行时动态生成的,因此logger/JVM不会"知道"堆栈跟踪或相关的行号吗?
我们目前正在调试和调查以获取更多信息,但也许这听起来很熟悉.
我已经创建了一个自定义的logback appender.但是play为appender提供了一个ClassNotFound异常.
以下是我的追加者
package log
import ch.qos.logback.core.AppenderBase
import ch.qos.logback.core.UnsynchronizedAppenderBase
import ch.qos.logback.core.spi.ContextAwareBase
import log.model.LogMessage
import data.OrganizationDao
import log.dao.LogDao
import ch.qos.logback.core.status.Status
class MongoAppender extends ContextAwareBase {
private def add(level:Int, msg: String, ex: Throwable) = {
val message = ex match {
case null => LogMessage(None, level, msg, null, null, new Array[String](0))
case _ => LogMessage(None, level, msg, ex.getClass().getName(), ex.getMessage(), new Array[String](0))
}
LogDao.save(message)
}
override def addStatus(status:Status) = {
add(status.getLevel(), status.getMessage(), status.getThrowable())
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我的logger.xml
<configuration>
<conversionRule conversionWord="coloredLevel"
converterClass="play.api.Logger$ColoredLevel" />
<appender name="Mongo" …Run Code Online (Sandbox Code Playgroud) 我在WildFly 8中运行Web应用程序,由于某种原因它不会记录.我使用SLF4J和LOGBACK.日志文件是在部署时创建的,但它是空的.我也没有在wildfly日志中看到我的日志语句.
该课程包含:
package com.blah.oops;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
static final Logger log = LoggerFactory.getLogger(EndpointImpl.class);
log.debug("request called");
Run Code Online (Sandbox Code Playgroud)
战争包含:
配置文件logback.xml包含:
<configuration scan="true" scanPeriod="10 seconds">
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOG_PATH}/backend-main.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} %msg%n</pattern>
</encoder>
</appender>
<!-- PROFILER configuration -->
<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
<Marker>PROFILER</Marker>
<OnMatch>ACCEPT</OnMatch>
<!-- <OnMatch>DENY</OnMatch> -->
</turboFilter>
<logger name="org.eclipse.jetty.util.log" level="info"/>
<logger name="com.blah" level="debug"/>
<logger name="org.apache.cxf" level="warn"/>
<root level="info">
<appender-ref ref="FILE"/>
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
console.log包含logback初始化:
.[0m.[0m10:19:52,716 INFO [stdout] (MSC service thread 1-2) 10:19:52,489 |-INFO in …Run Code Online (Sandbox Code Playgroud) 我想写日志,如:
2014-04-17 11:00:16.408 [http-apr-9090-exec-4] DEBUG package.method(line) - log.
Run Code Online (Sandbox Code Playgroud)
所以我在模式中配置logback.xml,配置如下:
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M(%line) - %msg%n
Run Code Online (Sandbox Code Playgroud)
除了行号,每件事都显示确定,如果我添加像
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M %line - %msg%n
Run Code Online (Sandbox Code Playgroud)
一切都行.所以我的配置肯定有问题.
谁能帮助我?谢谢.我希望显示我想要的内容,方法名称和行号之间没有空格.
我成功地使用Spring的@Scheduled注释每几秒执行一次方法.唯一的问题是,由于这种方法,我从Hibernate和Spring获得了很多关于事务等的日志消息.
我想保持日志记录级别相同,因为我喜欢接收应用程序中其他事务的此信息.
在执行特定方法时,是否有一种方法可以暂时禁止另一个库的日志记录?
我使用tomcat并简单地覆盖默认日志系统.如何在我的spring应用程序中使用wildfly上的logback启用日志记录?
我的logback.xml是关于tomcat的
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<logger name="org.springframework" level="WARN" />
<logger name="com.citronium.planstery" level="INFO" />
<logger name="org.apache.http.impl.conn.tsccm" level="ERROR" />
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)