1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.logging.log4j.core.async;
19
20 import org.apache.logging.log4j.status.StatusLogger;
21 import org.apache.logging.log4j.util.PropertiesUtil;
22
23
24
25
26 public enum ThreadNameCachingStrategy {
27 CACHED {
28 @Override
29 public String getThreadName() {
30 String result = THREADLOCAL_NAME.get();
31 if (result == null) {
32 result = Thread.currentThread().getName();
33 THREADLOCAL_NAME.set(result);
34 }
35 return result;
36 }
37 },
38 UNCACHED {
39 @Override
40 public String getThreadName() {
41 return Thread.currentThread().getName();
42 }
43 };
44
45 private static final StatusLogger LOGGER = StatusLogger.getLogger();
46 private static final ThreadLocal<String> THREADLOCAL_NAME = new ThreadLocal<>();
47
48 abstract String getThreadName();
49
50 public static ThreadNameCachingStrategy create() {
51 final String defaultStrategy = System.getProperty("java.version").compareTo("1.8.0_102") < 0
52 ? "CACHED"
53 : "UNCACHED";
54 final String name = PropertiesUtil.getProperties().getStringProperty("AsyncLogger.ThreadNameStrategy");
55 try {
56 final ThreadNameCachingStrategy result = ThreadNameCachingStrategy.valueOf(
57 name != null ? name : defaultStrategy);
58 LOGGER.debug("AsyncLogger.ThreadNameStrategy={} (user specified {}, default is {})",
59 result, name, defaultStrategy);
60 return result;
61 } catch (final Exception ex) {
62 LOGGER.debug("Using AsyncLogger.ThreadNameStrategy.{}: '{}' not valid: {}",
63 defaultStrategy, name, ex.toString());
64 return ThreadNameCachingStrategy.valueOf(defaultStrategy);
65 }
66 }
67 }