日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java slf4j日志级别_java - 在slf4j中设置运行时消息的日志级别 - 堆栈内存溢出

發(fā)布時(shí)間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java slf4j日志级别_java - 在slf4j中设置运行时消息的日志级别 - 堆栈内存溢出 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

===============>>#1 票數(shù):41 已采納

使用slf4j無法做到這slf4j 。

我想,缺少這個(gè)功能的原因是,幾乎不可能為slf4j構(gòu)建一個(gè)Level類型,它可以有效地映射到Facade后面所有可能的日志記錄實(shí)現(xiàn)中使用的Level (或等效)類型。 或者,設(shè)計(jì)人員認(rèn)為您的用例太不尋常 ,無法證明支持它的開銷。

關(guān)于@ ripper234的用例 (單元測(cè)試),我認(rèn)為實(shí)用的解決方案是修改單元測(cè)試,以便在運(yùn)行單元測(cè)試時(shí)強(qiáng)硬了解slf4j外觀背后的日志系統(tǒng)。

===============>>#2 票數(shù):25

Richard Fearn有正確的想法,所以我根據(jù)他的骨架代碼編寫了完整的類。 希望足夠短,可以在這里發(fā)布。 復(fù)制和粘貼享受。 我應(yīng)該添加一些神奇的咒語(yǔ):“此代碼發(fā)布到公共領(lǐng)域”

import org.slf4j.Logger;

public class LogLevel {

/**

* Allowed levels, as an enum. Import using "import [package].LogLevel.Level"

* Every logging implementation has something like this except SLF4J.

*/

public static enum Level {

TRACE, DEBUG, INFO, WARN, ERROR

}

/**

* This class cannot be instantiated, why would you want to?

*/

private LogLevel() {

// Unreachable

}

/**

* Log at the specified level. If the "logger" is null, nothing is logged.

* If the "level" is null, nothing is logged. If the "txt" is null,

* behaviour depends on the SLF4J implementation.

*/

public static void log(Logger logger, Level level, String txt) {

if (logger != null && level != null) {

switch (level) {

case TRACE:

logger.trace(txt);

break;

case DEBUG:

logger.debug(txt);

break;

case INFO:

logger.info(txt);

break;

case WARN:

logger.warn(txt);

break;

case ERROR:

logger.error(txt);

break;

}

}

}

/**

* Log at the specified level. If the "logger" is null, nothing is logged.

* If the "level" is null, nothing is logged. If the "format" or the "argArray"

* are null, behaviour depends on the SLF4J-backing implementation.

*/

public static void log(Logger logger, Level level, String format, Object[] argArray) {

if (logger != null && level != null) {

switch (level) {

case TRACE:

logger.trace(format, argArray);

break;

case DEBUG:

logger.debug(format, argArray);

break;

case INFO:

logger.info(format, argArray);

break;

case WARN:

logger.warn(format, argArray);

break;

case ERROR:

logger.error(format, argArray);

break;

}

}

}

/**

* Log at the specified level, with a Throwable on top. If the "logger" is null,

* nothing is logged. If the "level" is null, nothing is logged. If the "format" or

* the "argArray" or the "throwable" are null, behaviour depends on the SLF4J-backing

* implementation.

*/

public static void log(Logger logger, Level level, String txt, Throwable throwable) {

if (logger != null && level != null) {

switch (level) {

case TRACE:

logger.trace(txt, throwable);

break;

case DEBUG:

logger.debug(txt, throwable);

break;

case INFO:

logger.info(txt, throwable);

break;

case WARN:

logger.warn(txt, throwable);

break;

case ERROR:

logger.error(txt, throwable);

break;

}

}

}

/**

* Check whether a SLF4J logger is enabled for a certain loglevel.

* If the "logger" or the "level" is null, false is returned.

*/

public static boolean isEnabledFor(Logger logger, Level level) {

boolean res = false;

if (logger != null && level != null) {

switch (level) {

case TRACE:

res = logger.isTraceEnabled();

break;

case DEBUG:

res = logger.isDebugEnabled();

break;

case INFO:

res = logger.isInfoEnabled();

break;

case WARN:

res = logger.isWarnEnabled();

break;

case ERROR:

res = logger.isErrorEnabled();

break;

}

}

return res;

}

}

===============>>#3 票數(shù):12

嘗試切換到Logback并使用

ch.qos.logback.classic.Logger rootLogger = (ch.qos.logback.classic.Logger)LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);

rootLogger.setLevel(Level.toLevel("info"));

我相信這將是對(duì)Logback的唯一調(diào)用,其余代碼將保持不變。 Logback使用SLF4J,遷移將毫不費(fèi)力,只需要更改xml配置文件。

記得在完成后重新設(shè)置日志級(jí)別。

===============>>#4 票數(shù):11

您可以使用Java 8 lambdas實(shí)現(xiàn)此功能。

import java.util.HashMap;

import java.util.Map;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.slf4j.event.Level;

public class LevelLogger {

private static final Logger LOGGER = LoggerFactory.getLogger(LevelLogger.class);

private static final Map map;

static {

map = new HashMap<>();

map.put(Level.TRACE, (o) -> LOGGER.trace(o));

map.put(Level.DEBUG, (o) -> LOGGER.debug(o));

map.put(Level.INFO, (o) -> LOGGER.info(o));

map.put(Level.WARN, (o) -> LOGGER.warn(o));

map.put(Level.ERROR, (o) -> LOGGER.error(o));

}

public static void log(Level level, String s) {

map.get(level).log(s);

}

@FunctionalInterface

private interface LoggingFunction {

public void log(String arg);

}

}

===============>>#5 票數(shù):6

這可以使用enum和輔助方法完成:

enum LogLevel {

TRACE,

DEBUG,

INFO,

WARN,

ERROR,

}

public static void log(Logger logger, LogLevel level, String format, Object[] argArray) {

switch (level) {

case TRACE:

logger.trace(format, argArray);

break;

case DEBUG:

logger.debug(format, argArray);

break;

case INFO:

logger.info(format, argArray);

break;

case WARN:

logger.warn(format, argArray);

break;

case ERROR:

logger.error(format, argArray);

break;

}

}

// example usage:

private static final Logger logger = ...

final LogLevel level = ...

log(logger, level, "Something bad happened", ...);

您可以添加其他log變量,例如,如果您想要SLF4J的1參數(shù)或2參數(shù)warn / error /等的通用等價(jià)物。 方法。

===============>>#6 票數(shù):5

任何想要完全解決此問題的SLF4J兼容解決方案的人都可以查看Lidalia SLF4J擴(kuò)展 - 它位于Maven Central上。

===============>>#7 票數(shù):2

我只是需要這樣的東西并提出:

@RequiredArgsConstructor //lombok annotation

public enum LogLevel{

TRACE(l -> l::trace),

INFO (l -> l::info),

WARN (l -> l::warn),

ERROR(l -> l::error);

private final Function> function;

public void log(Logger logger, String message) {

function.apply(logger).accept(message);

}

}

用法:

LogLevel level = LogLevel.TRACE;

level.log(logger, "message");

Logger在調(diào)用期間傳遞,因此類信息應(yīng)該沒問題,并且它與@ Slf4j lombok注釋很好地配合。

===============>>#8 票數(shù):1

無法在開箱即用的sjf4j 1.x指定日志級(jí)別。 但是slf4j 2.0有希望解決這個(gè)問題 。 在2.0中它可能看起來像這樣:

// POTENTIAL 2.0 SOLUTION

import org.slf4j.helpers.Util;

import static org.slf4j.spi.LocationAwareLogger.*;

// does not work with slf4j 1.x

Util.log(logger, DEBUG_INT, "hello world!");

同時(shí),對(duì)于slf4j 1.x,您可以使用此解決方法:

將此類復(fù)制到您的類路徑中:

import org.slf4j.Logger;

import java.util.function.Function;

public enum LogLevel {

TRACE(l -> l::trace, Logger::isTraceEnabled),

DEBUG(l -> l::debug, Logger::isDebugEnabled),

INFO(l -> l::info, Logger::isInfoEnabled),

WARN(l -> l::warn, Logger::isWarnEnabled),

ERROR(l -> l::error, Logger::isErrorEnabled);

interface LogMethod {

void log(String format, Object... arguments);

}

private final Function logMethod;

private final Function isEnabledMethod;

LogLevel(Function logMethod, Function isEnabledMethod) {

this.logMethod = logMethod;

this.isEnabledMethod = isEnabledMethod;

}

public LogMethod prepare(Logger logger) {

return logMethod.apply(logger);

}

public boolean isEnabled(Logger logger) {

return isEnabledMethod.apply(logger);

}

}

然后你可以像這樣使用它:

Logger logger = LoggerFactory.getLogger(Application.class);

LogLevel level = LogLevel.ERROR;

level.prepare(logger).log("It works!"); // just message, without parameter

level.prepare(logger).log("Hello {}!", "world"); // with slf4j's parameter replacing

try {

throw new RuntimeException("Oops");

} catch (Throwable t) {

level.prepare(logger).log("Exception", t);

}

if (level.isEnabled(logger)) {

level.prepare(logger).log("logging is enabled");

}

這將輸出如下日志:

[main] ERROR Application - It works!

[main] ERROR Application - Hello world!

[main] ERROR Application - Exception

java.lang.RuntimeException: Oops

at Application.main(Application.java:14)

[main] ERROR Application - logging is enabled

這值得么?

Pro保留源代碼位置 (類名,方法名,行號(hào)將指向您的代碼)

Pro您可以輕松地將變量 ,參數(shù)和返回類型定義為L(zhǎng)ogLevel

Pro您的業(yè)??務(wù)代碼保持簡(jiǎn)短易讀,不需要其他依賴項(xiàng) 。

作為最小示例的源代碼托管在GitHub上 。

===============>>#9 票數(shù):0

我剛剛遇到了類似的需求。 在我的例子中,slf4j配置了java日志適配器(jdk14)。 使用以下代碼片段,我設(shè)法在運(yùn)行時(shí)更改調(diào)試級(jí)別:

Logger logger = LoggerFactory.getLogger("testing");

java.util.logging.Logger julLogger = java.util.logging.Logger.getLogger("testing");

julLogger.setLevel(java.util.logging.Level.FINE);

logger.debug("hello world");

===============>>#10 票數(shù):0

基于massimo virgilio的答案,我還設(shè)法使用內(nèi)省來使用slf4j-log4j。 HTH。

Logger LOG = LoggerFactory.getLogger(MyOwnClass.class);

org.apache.logging.slf4j.Log4jLogger LOGGER = (org.apache.logging.slf4j.Log4jLogger) LOG;

try {

Class loggerIntrospected = LOGGER.getClass();

Field fields[] = loggerIntrospected.getDeclaredFields();

for (int i = 0; i < fields.length; i++) {

String fieldName = fields[i].getName();

if (fieldName.equals("logger")) {

fields[i].setAccessible(true);

org.apache.logging.log4j.core.Logger loggerImpl = (org.apache.logging.log4j.core.Logger) fields[i].get(LOGGER);

loggerImpl.setLevel(Level.DEBUG);

}

}

} catch (Exception e) {

System.out.println("ERROR :" + e.getMessage());

}

===============>>#11 票數(shù):0

這是一個(gè)lambda解決方案,不像@Paul Croarkin那樣用戶友好(水平有效地傳遞了兩次)。 但我認(rèn)為(a)用戶應(yīng)該通過Logger; (b)AFAIU原始問題并不是要求應(yīng)用程序中的任何地方使用方便的方法,只是在圖書館內(nèi)幾乎沒有使用的情況。

package test.lambda;

import java.util.function.*;

import org.slf4j.*;

public class LoggerLambda {

private static final Logger LOG = LoggerFactory.getLogger(LoggerLambda.class);

private LoggerLambda() {}

public static void log(BiConsumer super String, ? super Object[]> logFunc, Supplier logEnabledPredicate,

String format, Object... args) {

if (logEnabledPredicate.get()) {

logFunc.accept(format, args);

}

}

public static void main(String[] args) {

int a = 1, b = 2, c = 3;

Throwable e = new Exception("something went wrong", new IllegalArgumentException());

log(LOG::info, LOG::isInfoEnabled, "a = {}, b = {}, c = {}", a, b, c);

// warn(String, Object...) instead of warn(String, Throwable), but prints stacktrace nevertheless

log(LOG::warn, LOG::isWarnEnabled, "error doing something: {}", e, e);

}

}

由于slf4j 允許在varargs參數(shù)中使用Throwable(其堆棧跟蹤應(yīng)該被記錄) ,我認(rèn)為不需要為其他使用者重載log助手方法(String, Object[]) 。

===============>>#12 票數(shù):0

我能夠通過首先請(qǐng)求SLF4J Logger實(shí)例然后在綁定上設(shè)置級(jí)別來為JDK14綁定執(zhí)行此操作 - 您可以嘗試使用Log4J綁定。

private void setLevel(Class loggerClass, java.util.logging.Level level) {

org.slf4j.LoggerFactory.getLogger(loggerClass);

java.util.logging.Logger.getLogger(loggerClass.getName()).setLevel(level);

}

===============>>#13 票數(shù):0

我使用的方法是導(dǎo)入ch.qos.logback模塊,然后將slf4j Logger實(shí)例類型轉(zhuǎn)換為ch.qos.logback.classic.Logger。 此實(shí)例包含setLevel()方法。

import ch.qos.logback.classic.Level;

import ch.qos.logback.classic.Logger;

Logger levelSet = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);

// Now you can set the desired logging-level

levelSet.setLevel( Level.OFF );

要找出可能的日志級(jí)別,您可以展開ch.qos.logback類以查看Level的所有可能值:

prompt$ javap -cp logback-classic-1.2.3.jar ch.qos.logback.classic.Level

結(jié)果如下:

{

// ...skipping

public static final ch.qos.logback.classic.Level OFF;

public static final ch.qos.logback.classic.Level ERROR;

public static final ch.qos.logback.classic.Level WARN;

public static final ch.qos.logback.classic.Level INFO;

public static final ch.qos.logback.classic.Level DEBUG;

public static final ch.qos.logback.classic.Level TRACE;

public static final ch.qos.logback.classic.Level ALL;

}

===============>>#14 票數(shù):0

使用slf4j API無法動(dòng)態(tài)更改日志級(jí)別,但您可以自己配置logback(如果使用此項(xiàng))。 在這種情況下,為您的記錄器創(chuàng)建工廠類,并使用您需要的配置實(shí)現(xiàn)根記錄器。

LoggerContext loggerContext = new LoggerContext();

ch.qos.logback.classic.Logger root = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);

// Configure appender

final TTLLLayout layout = new TTLLLayout();

layout.start(); // default layout of logging messages (the form that message displays

// e.g. 10:26:49.113 [main] INFO com.yourpackage.YourClazz - log message

final LayoutWrappingEncoder encoder = new LayoutWrappingEncoder<>();

encoder.setCharset(StandardCharsets.UTF_8);

encoder.setLayout(layout);

final ConsoleAppender appender = new ConsoleAppender<>();

appender.setContext(loggerContext);

appender.setEncoder(encoder);

appender.setName("console");

appender.start();

root.addAppender(appender);

配置根記錄器后(只需一次就足夠了),您可以委派獲取新的記錄器

final ch.qos.logback.classic.Logger logger = loggerContext.getLogger(clazz);

請(qǐng)記住使用相同的loggerContext 。

使用loggerContext提供的root logger可以輕松更改日志級(jí)別。

root.setLevel(Level.DEBUG);

===============>>#15 票數(shù):-2

使用java自省可以做到,例如:

private void changeRootLoggerLevel(int level) {

if (logger instanceof org.slf4j.impl.Log4jLoggerAdapter) {

try {

Class loggerIntrospected = logger.getClass();

Field fields[] = loggerIntrospected.getDeclaredFields();

for (int i = 0; i < fields.length; i++) {

String fieldName = fields[i].getName();

if (fieldName.equals("logger")) {

fields[i].setAccessible(true);

org.apache.log4j.Logger loggerImpl = (org.apache.log4j.Logger) fields[i]

.get(logger);

if (level == DIAGNOSTIC_LEVEL) {

loggerImpl.setLevel(Level.DEBUG);

} else {

loggerImpl.setLevel(org.apache.log4j.Logger.getRootLogger().getLevel());

}

// fields[i].setAccessible(false);

}

}

} catch (Exception e) {

org.apache.log4j.Logger.getLogger(LoggerSLF4JImpl.class).error("An error was thrown while changing the Logger level", e);

}

}

}

===============>>#16 票數(shù):-6

不,它有很多方法,info(),debug(),warn()等(這取代了優(yōu)先級(jí)字段)

ask by Edward Dale translate from so

總結(jié)

以上是生活随笔為你收集整理的java slf4j日志级别_java - 在slf4j中设置运行时消息的日志级别 - 堆栈内存溢出的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。