Jawaban:
Baik melalui properti sistem
-Dorg.slf4j.simpleLogger.defaultLogLevel=debug
atau simplelogger.properties
file di classpath
lihat http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html untuk detailnya
defaultLogLevel
) berfungsi. Hanya menemukan saya memodifikasi program di folder yang salah ;-) Dan defaultlog
tidak berhasil. Jadi, Anda mungkin ingin mengedit jawaban Anda meskipun saya telah menerimanya
Ini adalah contoh simplelogger.properties
yang dapat Anda tempatkan di classpath (batalkan komentar pada properti yang ingin Anda gunakan):
# SLF4J's SimpleLogger configuration file
# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err.
# Default logging detail level for all instances of SimpleLogger.
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, defaults to "info".
#org.slf4j.simpleLogger.defaultLogLevel=info
# Logging detail level for a SimpleLogger instance named "xxxxx".
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, the default logging detail level is used.
#org.slf4j.simpleLogger.log.xxxxx=
# Set to true if you want the current date and time to be included in output messages.
# Default is false, and will output the number of milliseconds elapsed since startup.
#org.slf4j.simpleLogger.showDateTime=false
# The date and time format to be used in the output messages.
# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat.
# If the format is not specified or is invalid, the default format is used.
# The default format is yyyy-MM-dd HH:mm:ss:SSS Z.
#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z
# Set to true if you want to output the current thread name.
# Defaults to true.
#org.slf4j.simpleLogger.showThreadName=true
# Set to true if you want the Logger instance name to be included in output messages.
# Defaults to true.
#org.slf4j.simpleLogger.showLogName=true
# Set to true if you want the last component of the name to be included in output messages.
# Defaults to false.
#org.slf4j.simpleLogger.showShortLogName=false
org.slf4j.simpleLogger.logFile
- Target keluaran yang dapat menjadi path ke file, atau nilai-nilai khusus "System.out" dan "System.err". Standarnya adalah "System.err". Lihat slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Anda dapat mengubahnya secara terprogram dengan mengatur properti sistem:
public class App {
public static void main(String[] args) {
System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "TRACE");
final org.slf4j.Logger log = LoggerFactory.getLogger(App.class);
log.trace("trace");
log.debug("debug");
log.info("info");
log.warn("warning");
log.error("error");
}
}
Level lognya adalah ERROR> WARN> INFO> DEBUG> TRACE.
Harap dicatat bahwa setelah logger dibuat, level log tidak dapat diubah. Jika Anda perlu mengubah level logging secara dinamis, Anda mungkin ingin menggunakan log4j dengan SLF4J.
org.slf4j.impl.SimpleLogger
Maksud Anda kode sumber yang sebenarnya daripada doc?
LOG_FILE_KEY
properti tidak dapat diubah setelah pencatat dibuat?
Saya perhatikan bahwa Eemuli mengatakan bahwa Anda tidak dapat mengubah level log setelah dibuat - dan walaupun itu mungkin desainnya, itu tidak sepenuhnya benar.
Saya mengalami situasi di mana saya menggunakan perpustakaan yang masuk ke slf4j - dan saya menggunakan perpustakaan sambil menulis plugin maven mojo.
Maven menggunakan versi (diretas) dari slf4j SimpleLogger, dan saya tidak bisa mendapatkan kode plugin saya untuk mengubah rute logging ke sesuatu seperti log4j, yang bisa saya kendalikan.
Dan saya tidak bisa mengubah konfigurasi logging pakar.
Jadi, untuk menenangkan beberapa pesan info berisik, saya menemukan saya bisa menggunakan refleksi seperti ini, untuk menggunakan SimpleLogger saat runtime.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.spi.LocationAwareLogger;
try
{
Logger l = LoggerFactory.getLogger("full.classname.of.noisy.logger"); //This is actually a MavenSimpleLogger, but due to various classloader issues, can't work with the directly.
Field f = l.getClass().getSuperclass().getDeclaredField("currentLogLevel");
f.setAccessible(true);
f.set(l, LocationAwareLogger.WARN_INT);
}
catch (Exception e)
{
getLog().warn("Failed to reset the log level of " + loggerName + ", it will continue being noisy.", e);
}
Tentu saja, perhatikan, ini bukan solusi yang sangat stabil / dapat diandalkan ... karena akan pecah saat berikutnya para pakar mengubah logger mereka.