Log targets. @author BaseX Team, BSD License @author Christian Gruen
| 14 | * @author Christian Gruen |
| 15 | */ |
| 16 | enum LogTarget { |
| 17 | /** Standard output. */ |
| 18 | STDOUT { |
| 19 | @Override |
| 20 | void write(final Log log, final LogEntry entry) { |
| 21 | Util.println(entry); |
| 22 | } |
| 23 | }, |
| 24 | /** Standard error.*/ |
| 25 | STDERR { |
| 26 | @Override |
| 27 | void write(final Log log, final LogEntry entry) { |
| 28 | Util.errln(entry); |
| 29 | } |
| 30 | }, |
| 31 | /** Database directory. */ |
| 32 | DATA { |
| 33 | @Override |
| 34 | void write(final Log log, final LogEntry entry) throws IOException { |
| 35 | log.write(entry); |
| 36 | } |
| 37 | }, |
| 38 | /** SLF4J logging.*/ |
| 39 | SLF4J { |
| 40 | @Override |
| 41 | void write(final Log log, final LogEntry entry) { |
| 42 | if(slf4j != null) slf4j.accept(entry.type, entry.toString()); |
| 43 | } |
| 44 | }; |
| 45 | |
| 46 | /** SLF4J logger ({@code null} if not available). */ |
| 47 | private static BiConsumer<String, String> slf4j; |
| 48 | |
| 49 | static { |
| 50 | final Class<?> cLoggerFactory = Reflect.find("org.slf4j.LoggerFactory"); |
| 51 | final Class<?> cLogger = Reflect.find("org.slf4j.Logger"); |
| 52 | final Method mLogger = Reflect.method(cLoggerFactory, "getLogger", String.class); |
| 53 | final Object logger = Reflect.invoke(mLogger, null, Prop.NAME); |
| 54 | slf4j = (type, text) -> { |
| 55 | final String level = Strings.eqic(type, "trace", "debug", "warn", "error") ? |
| 56 | type.toLowerCase(Locale.ENGLISH) : "info"; |
| 57 | final Method method = Reflect.method(cLogger, level, String.class); |
| 58 | if(method != null) { |
| 59 | Reflect.invoke(method, logger, text); |
| 60 | } else { |
| 61 | Util.errln("SLF4J logger not available."); |
| 62 | slf4j = null; |
| 63 | } |
| 64 | }; |
| 65 | } |
| 66 | |
| 67 | /** |
| 68 | * Writes a log entry. |
| 69 | * @param log logger |
| 70 | * @param entry log entry |
| 71 | * @throws IOException I/O exception |
| 72 | */ |
| 73 | abstract void write(Log log, LogEntry entry) throws IOException; |