我不喜欢它的输出com.sun.enterprise.server.logging.UniformLogFormatter可能是统一的但不是很有帮助.因此,在第一步中,我只是将其替换为java.util.logging.SimpleFormatter.这个实际工作正常,但有一个java.lang.ClassCastException例外:
__PRE__
Beeing一个完美主义者我想摆脱这个例子,我想知道我是否可以从com.sun.enterprise.server.logging.UniformLogFormatter创建我自己的子类,并以某种方式将这个类安装到glassfish中.
但我找不到有关如何在Glassfish中安装自定义日志格式化程序的任何信息.有没有人指出这个问题?
logging.properties我的Java AppEngine项目(使用java.util.logging)中有一个文件,如下所示:
# Set the default logging level for all loggers to WARNING
.level = INFO
# tighten logging on the DataNucleus Categories
DataNucleus.JDO.level=WARN
# - All messages general to JDO
DataNucleus.JPA.level=WARN
# - All messages general to JPA
DataNucleus.Persistence.level=WARN
# - All messages relating to the persistence process
DataNucleus.Query.level=WARN
# - All messages relating to queries
DataNucleus.Lifecycle.level=WARN
# - All messages relating to object lifecycle changes
DataNucleus.Cache.level=WARN
# - All messages relating to the DataNucleus Cache …Run Code Online (Sandbox Code Playgroud) 我想在Tomcat6中自定义我的日志消息,并创建了一个类"MyFormatter",如下所示:
public class LogFormatter extends Formatter {
@Override
public String format(LogRecord record) {
StringBuilder sb = new StringBuilder();
sb.append("LOLCAT--")
.append(new Date(record.getMillis()))
.append(" \t")
.append(record.getThreadID())
.append(" \t")
.append(record.getSourceMethodName())
.append(" \t")
.append(record.getSourceClassName())
.append(" \t")
.append(record.getLevel().getLocalizedName())
.append(": ")
.append(formatMessage(record))
.append(System.getProperty("line.separator"));
return sb.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
我把它打包成一个.jar并放在$ {catalina.home}/lib中.
在我的logging.properties文件中,我添加了以下内容:
1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = lolcat.
1catalina.org.apache.juli.FileHandler.formatter = my.package.LogFormatter
Run Code Online (Sandbox Code Playgroud)
在尝试不同的包装,不同的配置后,我决定尝试内置的"org.apache.juli.OneLineFormatter" - 这完美地运作.所以配置应该没问题.
问题依然存在,为什么Tomcat6加载我的类?
SLF4J(1.7.5,但实际上是任何现代版本)附带了几个"over"(迁移器)JAR:
jcl-over-slf4j-1.7.5.jarlog4j-over-slf4j-1.7.5.jar......以及"to"(桥梁)JAR:
jul-to-slf4j-1.7.5.jar根据他们的文档,迁移者:
...从[JCL/log4j]轻松[s]迁移到SLF4J.此jar文件旨在作为[JCL/log4j]的替代品.它实现了[ir]公共API但在下面使用SLF4J,因此名称"over"SLF4J.
而JUL桥:
将所有传入的jul记录路由到SLF4j API.
jcl-over-slf4j-1.7.5.jar的时候我有一个记录使用JCL代码,但我想它使用SLF4J?或者是其他东西?jul-to-slf4j-1.7.5.jar什么时候用?这里的"to"一词与"over"的使用方式有何不同?在java.util.logging日志记录框架中有一个Logger名为的特殊实例"global",但我找不到任何有关其预期用途的文档.Logger.getGlobal()刚才说的文件
使用名称返回全局记录器对象
Logger.GLOBAL_LOGGER_NAME.
Logger.GLOBAL_LOGGER_NAME反过来,只记录为
GLOBAL_LOGGER_NAME是全局记录器的名称.
我相当广泛的搜索没有找到任何更有用的文档.
什么是全球记录器用于什么?这是在我遗漏的地方记录的吗?
我有一个大型程序,我使用System.out进行调试.但我希望能够将所有System.out同时记录到一个文件中,所以即使我的程序没有在控制台中运行,所有System.out都会写入文件,我将能够看到它程序运行或以后的任何时刻.
顺便说一句,抓取所有程序并使用记录器而不是System.out语句是不明智的!
我试过java -jar myjar.jar > sysout.txt但它没有记录java logger实用程序记录的异常.
我有一些无法解释的行为java.util.logging。让我们来看看这两个样本:
第一的:
boolean var = false;
log.log( Level.WARNING, "Cant {0}", new Object[] { var } );
Run Code Online (Sandbox Code Playgroud)
输出:
Cant false
Run Code Online (Sandbox Code Playgroud)
第二:
boolean var = false;
log.log( Level.WARNING, "Can't {0}", new Object[] { var } );
Run Code Online (Sandbox Code Playgroud)
输出:
不能{0}
为什么包含撇号 ( ' ) 会导致记录器不扩展令牌?
我有以下课程来创建和管理一个Logger.每当跨代码和程序执行时,都会使用对静态getLogger() catch块的调用来记录.
public class Log {
private static final Logger logger = Logger.getLogger("MyLog");
public static void iniciarLog() throws IOException {
FileHandler fh;
try {
// fh = new FileHandler(System.getProperty("user.home")+System.getProperty("file.separator")+"TorrentDownloader.log");
fh = new FileHandler("%h/TorrentDownloader.log");
logger.addHandler(fh);
SimpleFormatter formatter = new SimpleFormatter();
fh.setFormatter(formatter);
logger.info("Se inició el log");
} catch (SecurityException | IOException e) {
logger.severe("Error al crear el log");
}
}
public static Logger getLogger() {
return logger;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如何附加到此类日志文件?我见过的所有例子都改变了很多我喜欢的实现,因为它清晰,简洁.
我一直试图在谷歌上查找这个答案一段时间,并认为我只是来这里寻找答案.
在生产过程中,这个设置工作正常,因为它打印到stdout和stderr,我将它分开并解析以供以后使用,但在开发期间,我们希望看到这些日志记录操作在它们发生时打印,即每个日志记录.我认为java将此称为自动刷新.我似乎无法找到我可以更改我具有的流处理程序对象的缓冲区大小,以解决此问题.
我有一些选择如下:
我使用java.util.logging来处理我的应用程序完成的所有日志记录,我们使用以下代码创建一个根记录器:
public Logger buildLogger()
{
Logger log = Logger.getLogger("") //TODO update when JDK updatesLogger.getGlobal() is what we would like to use here
log.setLevel(Level.WARNING)
log.setUseParentHandlers(false); //Turn off any Parent Handlers
Handler[] handlers = log.getHandlers();
for(Handler handler : handlers) {
log.removeHandler(handler);
}
log.addHandler(soh); //Add stdOut Handler
log.addHandler(seh); //Add stdErr Handler
return log;
}
Run Code Online (Sandbox Code Playgroud)
处理程序在这里
public StreamHandler buildsoh()
{
def soh = new StreamHandler(System.out, formatter)
soh.setLevel(Level.ALL); //Default StdOut Setting
return soh;
}
public StreamHandler buildseh() …Run Code Online (Sandbox Code Playgroud) 我正在使用一个库来记录一堆我不想记录的东西。它正在使用java.util.logging.
我也不想完全禁用它的日志记录,因为它的一些日志很有用。由于仅在我运行某个任务时才记录不需要的行,如果有禁用和启用日志记录的全局方式,它将解决我的问题。
理想情况下是这样的:
disableLogging();
taskThatMakesUnnecessaryLogs();
enableLogging();
Run Code Online (Sandbox Code Playgroud) java ×9
logging ×8
classloader ×1
datanucleus ×1
glassfish ×1
groovy ×1
java-ee ×1
log4j ×1
slf4j ×1
system.out ×1
tomcat6 ×1