From 9ec198575588cd0173cea358c3679726fd948e73 Mon Sep 17 00:00:00 2001 From: yikangfeng Date: Wed, 6 Mar 2019 20:39:33 +0800 Subject: [PATCH] Fix SimpleDateFormat concurrent issue in CspFormatter of sentinel-core (#548) --- .../csp/sentinel/log/CspFormatter.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/CspFormatter.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/CspFormatter.java index 84925614..b2a88979 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/CspFormatter.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/CspFormatter.java @@ -1,17 +1,14 @@ /* * Copyright 1999-2018 Alibaba Group Holding Ltd. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. */ package com.alibaba.csp.sentinel.log; @@ -28,10 +25,16 @@ import java.util.logging.LogRecord; */ class CspFormatter extends Formatter { - private final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private final ThreadLocal dateFormatThreadLocal = new ThreadLocal() { + @Override + public SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + }; @Override public String format(LogRecord record) { + final DateFormat df = dateFormatThreadLocal.get(); StringBuilder builder = new StringBuilder(1000); builder.append(df.format(new Date(record.getMillis()))).append(" "); builder.append(formatMessage(record));