我正在考虑将第三方Java应用程序连接到我们的日志聚合/分析解决方案(可能是Splunk,但我们还没有完成我们的选择).将Splunk代理挂钩到syslog似乎是最容易的,所以我正在寻找一种方法将应用程序日志重定向到服务器上的本地syslog守护程序.
Java应用程序使用java.util.logging,遗憾的是它没有开箱即用的syslog处理程序(我相信log4j确实如此).有没有经过验证的库可以做到这一点?日志负载不是很大(每个进程大概每分钟10-20条消息,每个主机最多6个进程)但是我关注可靠性和持久性(例如当守护进程停止时会发生什么?...).
任何帮助,将不胜感激...
我有一个使用外部库的java程序.主程序用于log4j记录其消息和库使用java.util.logging.
我的问题是来自外部库和主程序的日志消息在控制台中混合.
我想将来自外部库的所有日志消息重定向到文件.我试着用logging.properties文件做到这一点:
handlers= java.util.logging.FileHandler
.level= INFO
java.util.logging.FileHandler.pattern = foo.log
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
Run Code Online (Sandbox Code Playgroud)
该文件初始化为:
System.setProperty("java.util.logging.config.file", "logging.properties");
Run Code Online (Sandbox Code Playgroud)
不幸的是,来自外部库的日志消息不断出现在控制台中.我应该使用类似slf4j拦截日志消息的东西java.util.logging吗?
感谢您的时间.
Java日志记录配置文件允许我定义命名记录器的属性,例如
name.heikoseeberger.heikotron.level = FINE
name.heikoseeberger.heikotron.handlers = java.util.logging.FileHandler
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在我想配置特定的 FileHandler,例如使用特定的输出文件.不幸的是我只知道如何配置已存在于配置文件中的"全局" FileHandler:
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
Run Code Online (Sandbox Code Playgroud)
我不想配置这个,而是与我的自定义Logger相关联的实例.我已经尝试了以下内容,但没有成功:
name.heikoseeberger.heikotron.java.util.logging.FileHandler.pattern = %h/heikotron.log
name.heikoseeberger.heikotron.java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
Run Code Online (Sandbox Code Playgroud)
是否可以设置特定FileHandler实例的属性?如果是,那么如何识别/命名?
是否可以通过在应用程序启动时传递 JVM 选项来覆盖/设置 java.util.logging.Logger 的日志级别?
我遇到了一个真正让我感到困惑的问题。我想用 JUL 日志(JDK 日志)尝试一些东西。我从以下简单程序开始:
package biz.ple;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class Application {
public static void main(String[] args)
{
Logger logA = LogManager.getLogManager().getLogger("LoggerA");
Logger logB = LogManager.getLogManager().getLogger("LoggerB");
if (logA == null) {
System.out.println("LoggerA is null!");
}
if (logB == null) {
System.out.println("LoggerB is null!");
}
String normalMsg = "Message without cookie prefix.";
String cookieMsg = "[Cookie] Message with a cookie prefix.";
logA.info(normalMsg);
logA.info(cookieMsg);
logB.info(normalMsg);
logB.info(cookieMsg);
}
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,记录器 logA 和 logB始终为空。我在文档中读到应用程序没有强引用的记录器我随时都会被 GC,但在我看来变量 logA 和 logB 确实是强引用,不是吗?
我真的不明白这一点,希望得到任何帮助。
我有一个Web应用程序,我在其中使用java.util.logging.在我的logging.properties文件中,默认级别是info.我的应用程序中有记录器用于所有级别的日志记录(信息,调试,致命等).此Web应用程序将部署在WebSphere 8上.
如果我想在运行时通过WAS管理控制台更改日志记录级别,从信息到错误,应用程序怎么办?我怎样才能做到这一点?
我正在编写一个自定义日志配置类,它设置一个特定的处理程序并将其与根记录器相关联,并计划在多个应用程序中使用它.我担心实际的程序代码将删除该处理程序并安装另一个.
是否有一种方法可以让处理程序检测到它已从特定记录器中删除,或者记录器是否报告了该员工已更改?
我唯一的另一种选择是有一个线程,它会定期轮询根记录器处理程序并重新连接这个处理程序,这是非常难看的
我有以下问题:我想使用java.util.logging.Logger.没有我发现不同的资源,1,2,3,如何能够修改记录的行为.
特别是在2 a(在我看来)的问题中,给出了根据类名初始化记录器的良好结构.如果需要,这还允许在基于包的级别上修改详细程度以进行调试.
经过一番深入研究后发现,全局记录器和"空"记录器(带名称"")不一样.另请参见下面的示例.我刚刚创建了一个记录器foo.Bar,它锚定在空记录器而不是被调用的记录器上foo.只有在我第一次创建记录器时bar,记录器bar.Baz才会正确锚定.
这使得这个问题中的方法主要无用,因为我们不能假设之前创建的父记录器.根据需要,我必须根据需要解析类名并创建记录器.
我是否正确我必须添加一些static {...}代码以递归方式初始化记录器,然后才能初始化自己的记录器?如果多个类调用Logger.getLogger(String)包记录器的方法(导致总体上多次调用,例如两者bar.Baz并bar.FooBaz获取记录器bar),这会产生任何负面影响吗?
import java.util.Enumeration;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class TestLogger
{
public static void main(String[] args)
{
// Create the logger directly
Logger.getLogger("foo.Bar");
// Create the logger objects step-by-step
Logger.getLogger("bar");
Logger.getLogger("bar.Baz");
// Put the available loggers to output
Enumeration<String> e = LogManager.getLogManager().getLoggerNames();
while(e.hasMoreElements()) …Run Code Online (Sandbox Code Playgroud) 根据Google App Engine for Java的文档:
App Engine Java SDK在appengine-java-sdk/config/user /目录中包含模板logging.properties文件.要使用它,请将文件复制到WEB-INF/classes目录(或WAR中的其他位置),然后将系统属性java.util.logging.config.file复制到"WEB-INF/classes/logging.properties"(或无论您选择哪条路径,相对于应用程序根目录.您可以在appengine-web.xml文件中设置系统属性,如下所示:
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
...
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/classes/logging.properties" />
</system-properties>
</appengine-web-app>
Run Code Online (Sandbox Code Playgroud)
Google Plugin for Eclipse新项目向导会为您创建这些日志记录配置文件,并自动将它们复制到WEB-INF/classes /.对于java.util.logging,必须将system属性设置为使用此文件.
If your write to standard out or standard error, that will automatically get logged as INFO or WARNING.
那么,为什么需要使用logging.properties文件?
这是否可以为您提供对日志记录的额外控制?
我正在使用iText和Flying Saucer编译PDF,不幸的是,在编译时我似乎无法从Flying Saucer获得任何输出.我真的希望能够看到内部发生了什么,以便能够调试我面临的当前问题.
如何为Flying Saucer打开java.util.logging?我目前正在使用SLF4J/Logback.