我们已经开始使用第三方平台(GigaSpaces)来帮助我们进行分布式计算.我们现在要解决的一个主要问题是如何在这个分布式环境中管理我们的日志文件.我们目前有以下设置.
我们的平台分布在8台机器上.在每台机器上,我们有12-15个进程,使用java.util.logging记录分离日志文件.在这个平台上,我们有自己的应用程序,使用log4j和日志来分隔文件.我们还将stdout重定向到一个单独的文件以捕获线程转储等.
这导致大约200个不同的日志文件.
截至目前,我们没有工具来协助管理这些文件.在下列情况下,这会给我们带来严重的麻烦.
我们事先没有在出现问题的过程中知道故障排除.在这种情况下,我们当前使用ssh登录每台机器并开始使用grep.
通过定期检查日志中的任何异常情况来尝试主动.在这种情况下,我们当前还登录到所有计算机并使用less和查看不同的日志tail.
设置警报.我们希望在超过阈值的事件上设置警报.这看起来很痛苦,需要检查200个日志文件.
今天我们每秒只有大约5个日志事件,但随着我们将越来越多的代码迁移到新平台,这将会增加.
我想问社群以下问题.
非常感谢.
更新
我们最终评估了Splunk的试用版.我们对它的工作方式非常满意并决定购买它.易于设置,快速搜索和技术倾向的大量功能.我可以推荐任何类似情况的人来检查一下.
任何人都可以向我解释一下如何从具体包中为各种类设置java Logger?
例如:如果我得到这个并设置它
Logger logger = Logger.getLogger("com.google.api.client.*");
logger.setLevel(Level.CONFIG);
logger.addHandler(new Handler() {
@Override
public void close() throws SecurityException {
}
@Override
public void flush() {
}
@Override
public void publish(LogRecord record) {
// default ConsoleHandler will take care of >= INFO
if (record.getLevel().intValue() < Level.INFO.intValue()) {
System.out.println(record.getMessage());
}
}
});
Run Code Online (Sandbox Code Playgroud)
有这样的条件
Logger.getLogger(HttpTransport.class.getName()).isLoggable(Level.CONFIG);
在图书馆,在那里HttpTransport是的一部分com.google.api.client.*
但问题是,那个
Logger.getLogger(HttpTransport.class.getName()).isLoggable(Level.CONFIG);
Run Code Online (Sandbox Code Playgroud)
是false...就像是获得了不同的记录器一样
我应该如何为同一个包中的所有类设置它?如果有像HttpTransport这样的具体类的记录器的条件.
我有一个从Glassfish迁移到Weblogic的应用程序,它使用java.util.logging作为日志框架.
我发现使日志工作的唯一方法是编辑JVM的logging.properties文件并重新启动服务器.这个解决方案很笨拙并且会产生问题,因为日志写入的文件不同于weblogic的标准文件,因此我们必须查看群集环境中日志的文件太多.此外,由于某些原因,这在某些Windows系统上不起作用.
有没有办法继续使用标准的Java日志记录来将消息写入weblogic的标准日志文件?我尝试了此页面上的说明,但它也不起作用.
这个项目已传给我,所以我对此并不了解.有一种方法,使用log(java.util.logging.Logger)并创建两个日志文件:
第一个文件:fileName.log
第二个文件:fileName.log.lck
在Linux中,当我这样做时lsof,我看到这两个文件是打开的.如何关闭这两个文件?
我想关闭这些文件的原因是这种方法每天运行多次,几周后打开文件的数量达到一个限制(大约1000),此时我们的系统停止工作.当我们重新启动我们的进程(执行日志记录的"作业控制器")时,打开的日志文件数会变为0并再次运行.
这是做日志记录所做的
private static Logger log = Logger.getLogger(MyClass.class.getPackage().getName());
try{
log.logp(Level.SEVERE, "com.MyClass", "run", "It failed");
}
Run Code Online (Sandbox Code Playgroud)
这是我试图关闭finally块中的文件,但它不起作用
finally{
Handler[] handler = log.getHandlers();
for(Handler h: handler){
h.close();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用Slf4j和java.util.Logging设置的日志记录机制.我有几个线程,所以我无法从日志中得到一个清晰的想法,因为它们是混合的.现在我尝试使用MDC概念在日志文件中添加更多数据,以便它们清晰.
问题与Slf4j中的一样,虽然它支持MDC java.util.Logging不支持.但它说
如果底层框架不提供MDC,例如java.util.logging,则SLF4J仍将存储MDC数据,但其中的信息需要由自定义用户代码检索.
我正在尝试找到一种方法来执行此自定义代码.谷歌搜索对我没什么帮助.Slf4j中有一个名为"BasicMDCAdapter"的辅助类.但我不知道如何使用它.我无法在任何地方找到示例代码.
这也是一个有助于此的代码,但仍然没有给出一些描述.
我很感激这里的帮助.
谢谢.
我想根据使用的处理程序,答案可能会有所不同,但是假设使用了ConsoleHandler并使用了默认的SimpleFormatter.传递给SimpleFormatter.format()的每个参数的数量,类型和可能的含义/语义是什么?
我在另一个SO问题中找到了这个字符串:
"%1\$tY-%1\$tm-%1\$td %1\$tH:%1\$tM:%1\$tS.%1\$tL %4\$s %2\$s %5\$s%6\$s%n"
Run Code Online (Sandbox Code Playgroud)
(为Groovy添加了反斜杠)
注意缺少%3,那么这个论点是什么?而且有一个%7,%8等...和它们是什么?
我想%1是当前时间,%4是日志级别和其他几个......我正在寻找完整的参数列表及其含义/值.
我的logging.properties中有两个处理程序:
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
Run Code Online (Sandbox Code Playgroud)
两者都使用SimpleFormatter:
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
Run Code Online (Sandbox Code Playgroud)
但是现在我想要这些处理程序使用两种不同的格式。控制台处理程序应仅打印一条短消息。另一方面,文件处理程序应打印更详细的消息。但是如何为两个格式化程序使用不同的格式?以下无效:
java.util.logging.FileHandler.formatter.format = ...
Run Code Online (Sandbox Code Playgroud)
并使用
java.util.logging.SimpleFormatter.format
Run Code Online (Sandbox Code Playgroud)
下面的相应格式化程序也不起作用。有任何想法吗?我不想像变通办法那样实现自己的格式化程序...
我在类中使用Java登录。
例:
public class MyClass {
private static Logger logger = Logger.getLogger(MyClass.class.getName());
....
}
Run Code Online (Sandbox Code Playgroud)
当我为该类编写JUnit测试时,我想将Loglevel设置为'FINE'。我试过了:
@Before
public void setup() throws PluginException {
Logger.getGlobal().setLevel(Level.FINE);
....
}
Run Code Online (Sandbox Code Playgroud)
但这没有效果。使用Java日志记录时,如何在JUnit测试中控制日志级别?我正在使用Maven运行测试。
在Java类中java.util.logging.Logger,全局和根记录器之间有什么区别?它们是一样的吗?该Logger::getGlobal方法返回全局记录器.并且Logger::getParent反复调用直到结果为null将产生根记录器.当我Logger::getLogger使用空字符串调用name参数时,它是返回全局记录器还是根记录器?
http://docs.oracle.com/javase/9/docs/api/java/util/logging/Logger.html
我正在修复在tomcat 7上运行的旧版JSF应用程序。
UserAccessBB.java
package beans;
import java.util.logging.Level;
import java.util.logging.Logger;
public class UserAccessBB {
private static final Logger LOG =
Logger.getLogger(UserAccessBB.class.getName());
public UserAccessBB() {
LOG.fine("UserAccessBB");
Run Code Online (Sandbox Code Playgroud)
logback.xml
<logger name="beans" level="TRACE" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
Run Code Online (Sandbox Code Playgroud)
专家
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>0.9.20</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
该文件被复制到WEB-INF / classes
日志文件仅包含INFO和此类的更高级别的日志。仅当我修改根记录器时才打印较低的级别。问题出在哪里?