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 java.util.regex.Matcher;
21 import java.util.regex.Pattern;
22
23 import org.apache.logging.log4j.status.StatusLogger;
24 import org.apache.logging.log4j.util.Constants;
25 import org.apache.logging.log4j.util.PropertiesUtil;
26
27
28
29
30 public enum ThreadNameCachingStrategy {
31 CACHED {
32 @Override
33 public String getThreadName() {
34 String result = THREADLOCAL_NAME.get();
35 if (result == null) {
36 result = Thread.currentThread().getName();
37 THREADLOCAL_NAME.set(result);
38 }
39 return result;
40 }
41 },
42 UNCACHED {
43 @Override
44 public String getThreadName() {
45 return Thread.currentThread().getName();
46 }
47 };
48
49 private static final StatusLogger LOGGER = StatusLogger.getLogger();
50 private static final ThreadLocal<String> THREADLOCAL_NAME = new ThreadLocal<>();
51 static final ThreadNameCachingStrategy DEFAULT_STRATEGY = isAllocatingThreadGetName() ? CACHED : UNCACHED;
52
53 abstract String getThreadName();
54
55 public static ThreadNameCachingStrategy create() {
56 final String name = PropertiesUtil.getProperties().getStringProperty("AsyncLogger.ThreadNameStrategy");
57 try {
58 final ThreadNameCachingStrategy result = name != null ? ThreadNameCachingStrategy.valueOf(name) : DEFAULT_STRATEGY;
59 LOGGER.debug("AsyncLogger.ThreadNameStrategy={} (user specified {}, default is {})",
60 result.name(), name, DEFAULT_STRATEGY.name());
61 return result;
62 } catch (final Exception ex) {
63 LOGGER.debug("Using AsyncLogger.ThreadNameStrategy.{}: '{}' not valid: {}",
64 DEFAULT_STRATEGY.name(), name, ex.toString());
65 return DEFAULT_STRATEGY;
66 }
67 }
68
69 static boolean isAllocatingThreadGetName() {
70
71 if (Constants.JAVA_MAJOR_VERSION == 8) {
72 try {
73 Pattern javaVersionPattern = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)_(\\d+)");
74 Matcher m = javaVersionPattern.matcher(System.getProperty("java.version"));
75 if (m.matches()) {
76 return Integer.parseInt(m.group(3)) == 0 && Integer.parseInt(m.group(4)) < 102;
77 }
78 return true;
79 } catch (Exception e) {
80 return true;
81 }
82 } else {
83 return Constants.JAVA_MAJOR_VERSION < 8;
84 }
85 }
86 }