حدد المنطقة الزمنية لتاريخ log4j
سؤال
هل من الممكن تحديد المنطقة الزمنية التي سيستخدمها Log4J؟ أحتاج إلى التواريخ في ملف السجل لتكون منطقة زمنية مختلفة عن التطبيق. log4j PatternLayout
الاستخدامات SimpleDateFormat
. لسوء الحظ ، لا يبدو أن هناك وسيلة للسيطرة SimpleDateFormat
المنطقة الزمنية عبر سلسلة الأنماط (DateFormat
لديها setTimeZone
الطريقة ولكن هذا لا يساعد).
نظرت إلى مصدر Log4J و SimpleDateFormat
يتم تنظيمه في PatternParser.finalizeConverter
. لسوء الحظ ، لا توجد طريقة سهلة للحصول على DateFormat
لتعيين المنطقة الزمنية.
المحلول
إذا كنت تستخدم ملف JAR LOG4J الإضافي على ClassPath الخاص بك ، فإن فئة endustantpatternlayout تدعم خيار التكوين هذا. انظر جافادوك في هذا الرابط. يتم التعامل معها كجزء من مكون نمط ٪ D مثل هذا:
log4j.appender.stdout.layout.ConversionPattern=%d{}{America/New_York} %p [%c] - %m%n
يمكنك تنزيل حزمة الإضافات هنا.
نصائح أخرى
حالتي ... يجب تغيير patternlayout إلى تعزيز patternlayout. (log4j-1.2.17.jar)
log4j.appender.logfile.layout = org.apache.log4j.envancedpatternlayoutlog4j.appender.logfile.layout.conversionpattern = [٪ d {iso8601} {gmt+9}] ٪ - 5p - ٪ m ٪ n
يحتوي نمط السجل أعلاه على فكرة صحيحة ولكنه غير صحيح تمامًا (لا تحصل على أي طابع زمني في السجل).
استخدم هذا النمط بالتأكيد:
%d{ISO8601}{America/New_York} %p [%c] - %m%n
أو
%d{ISO8601}{GMT-5} %p [%c] - %m%n
من الأفضل استخدام شيء مثل {America/new_york} بدلاً من {gmt-5} لأنه من خلال تحديد منطقة زمنية سيتم إجراء تعديل تلقائي إذا كانت التوفير في ضوء النهار قيد التشغيل. سيؤدي تحديد شيء مثل GMT-5 إلى ضبط المنطقة الزمنية لـ GMT بمقدار الساعات المحددة.
وأيضًا أيضًا إذا كنت تتجه إلى Dinamicaly Obtein في المنطقة الزمنية الافتراضية ، فيمكنك تمديد المحسّن والكتابة على الطريقة "setConversionPattern" مثل هذا:
@Override
public void setConversionPattern(String conversionPattern) {
String defaultTimeZoneId = TimeZone.getDefault().getID();
String conversionPatternModif = conversionPattern.replaceAll(
"\\%d\\{([^\\{\\}]*)\\}([ ]*[^\\{]*)",
"%d{$1}{"+defaultTimeZoneId+"}$2");
super.setConversionPattern(conversionPatternModif);
}