我有一个子类和一个超类.在超类中,我有一个记录某些东西的方法.当我创建子类的实例时,记录器为超类创建日志消息.为什么会发生这种情况?
代码示例:
SuperClass.java
import java.util.logging.Level;
import java.util.logging.Logger;
public abstract class SuperClass {
public void logAndPrintClass(){
String name = this.getClass().getName();
System.out.println(name);
Logger logger = Logger.getLogger(name);
logger.log(Level.INFO, "Logmessage");
}
}
Run Code Online (Sandbox Code Playgroud)
SubClass.java
public class SubClass extends SuperClass {
}
Run Code Online (Sandbox Code Playgroud)
TestLogBubClass.java
public class TestLogBubClass {
public static void main(String[] args){
SuperClass obj = new SubClass();
obj.logAndPrintClass();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
SubClass
Mar 15, 2013 6:30:04 PM SuperClass logAndPrintClass
INFO: Logmessage
Run Code Online (Sandbox Code Playgroud)
如您所见,类的名称已正确打印,但在日志消息中显示不正确.
我的应用程序使用了许多库,我正在使用它们java.util.logging进行日志记录 我希望能够通过以下方式为每个库设置不同的日志记录级别:
org.datanucleus.*.level = WARNING
com.google.apphosting.*.level = WARNING
com.myapp.*.level = FINE
Run Code Online (Sandbox Code Playgroud)
有可能吗?
在我的输出中,我有来自Jersey的JUL记录消息
03.12.2010 14:14:55 com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
Run Code Online (Sandbox Code Playgroud)
以编程方式我想把它们关掉,所以我尝试了
Logger.getLogger("com.sun.jersey.api.core.PackagesResourceConfig").setLevel( Level.SEVERE );
Run Code Online (Sandbox Code Playgroud)
要么
Logger.getLogger("com.sun.jersey").setLevel( Level.SEVERE );
Run Code Online (Sandbox Code Playgroud)
但这不起作用.
有趣的是这个全局配置有效:
Logger.getLogger( "com" ).setLevel( Level.SEVERE );
Run Code Online (Sandbox Code Playgroud)
要么
Logger.getLogger( "" ).setLevel( Level.SEVERE );
Run Code Online (Sandbox Code Playgroud)
为什么?
我想记录到文件并将其设置在属性文件中,因为默认的logger.info()输出进入控制台,而在Web应用程序中,我的情况下没有控制台.
我正在使用Java util Logger.根据Logger.getLogger方法的文档,它说:"为命名的子系统查找或创建一个记录器.如果已经使用给定名称创建了一个记录器,则返回该记录器.否则将创建一个新的记录器." 每节课只召唤一次会有什么好处吗?
选项1:
public class Myclass
static Logger logger = Logger.getLogger(Myclass.class);
public void method1() {
logger.log(...);
}
public void method2() {
logger.log(....);
}
}
Run Code Online (Sandbox Code Playgroud)
选项2:
public class Myclass {
public void method1() {
Logger.getLogger(Myclass.class).log(...);
}
public void method2() {
Logger.getLogger(Myclass.class).log(...);
}
}
Run Code Online (Sandbox Code Playgroud) AppEngine使用JUL进行日志记录,我已经配置了logging.properties文件并引用了appengine-web.xml中的文件.
问题是AppEngine在控制台日志中显示数据的格式在每个日志行上大约180个字符后被截断.而且由于大部分内容都采用了方法和类名(包括包)和日期,因此没有太多实际的日志消息.
我试图以编程方式和通过logging.properties配置我自己的Formatter,但没有运气.
我意识到我可以通过slf4j,logback或log4j推送所有日志,但我相信这样做会导致所有这样的日志在AppEngine日志控制台中显示为stdout,它具有自己的详细风格.
有没有办法为AppEngine日志定义特定的格式,如果是这样的话?如果每个日志行没有被截断为180个字符,那就足够了.
我正在编写一个Jenkins插件,并使用mvn verify和测试它JenkinsRule.到目前为止这么好,但我希望能够平息输出; 这是每次测试的页面.我使用什么样的配置文件,我在哪里放?
我在src/test/resources(以及target/test-classes)中尝试了一个合适的log4j.properties(并且只是为了确保是一个logging.properties); 我已经尝试将它们放在target/jenkins-for-test/WEB-INF/classes中,这也没有帮助.
如果慢跑任何人的记忆,我试图抑制的输出就像是
Feb 08, 2014 2:26:40 PM jenkins.InitReactorRunner$1 onAttained
INFO: Started initialization
Feb 08, 2014 2:26:40 PM jenkins.InitReactorRunner$1 onAttained
INFO: Listed all plugins
Run Code Online (Sandbox Code Playgroud)
和
Feb 08, 2014 2:26:44 PM hudson.PluginWrapper stop
INFO: Stopping javadoc
Feb 08, 2014 2:26:44 PM hudson.PluginWrapper stop
INFO: Stopping maven-plugin
Run Code Online (Sandbox Code Playgroud) 我想我可以通过添加行java.util.logging.ConsoleHandler.pattern来设置模式,但是在哪里检查模式信息,如%u%h等?
我已经安装了Tomcat,并使用SLF4J作为我们的日志框架.我复制slf4j-api-1.6.4.jar并slf4j-jdk14-1.6.4.jar进入Tomcat库即$TOMCAT_HOME/lib.
我假设如果我使用SLF4J,它将委托给java.util.Logger,它将委托给底层的Tomcat日志框架.但是当我部署并检查我的应用程序时,我没有看到任何记录.我的所有异常/日志信息都会丢失.
我的理解是正确的,还是我错过了任何保持课堂路径的东西?
我想登录我的应用程序,其中包含几个类.我想在最后有一个.txt日志文件.因此,我创建了一个静态记录器实例,并在一个类中为它创建了一个FileHandler.因为我想拥有一个文件,所以我在FileHandler中将第二个参数设置为true,以便能够在日志记录期间附加日志文件.
public class MyLogging {
static Logger logger;
public Handler fileHandler;
Formatter plainText;
public MyLogging() throws IOException{
//instance the logger
logger = Logger.getLogger(MyLogging.class.getName());
//instance the filehandler
fileHandler = new FileHandler("myLog.txt",true);
//instance formatter, set formatting, and handler
plainText = new SimpleFormatter();
fileHandler.setFormatter(plainText);
logger.addHandler(fileHandler);
}
Run Code Online (Sandbox Code Playgroud)
之后,我创建了其他记录器.我知道我必须为每个类实例一个记录器.因此我只为每个类制作记录器(没有FileHandler).但所有的记录器都引用了一个类(不是我创建记录器的类).例如:
public class Test1 {
static Logger logger;
public Test1()throws IOException {
logger = Logger.getLogger(MyLogging.class.getName());
}
Run Code Online (Sandbox Code Playgroud)
虽然执行了日志记录,但我不确定这是否是正确的解决方案.你能给我一些建议如何用java.util.logging来记录多个类吗?