java - 如何以编程方式在log4j 2.x中配置输出编码?

时间:2018-01-25 15:06:13

标签: java character-encoding log4j2

关于configuring programmatically log4j2还有其他问题,但是我找不到配置日志输出编码的方法吗?

2 个答案:

答案 0 :(得分:1)

我没有以编程方式解决它。我的解决方案是使用此选项执行java解释器:

// Api.kt
@POST("authenticated_users")
fun postUser(
    @Body newUser: NewUser
): Observable<AuthUser>

class UserRepo @Inject constructor(private val api: Api) {
    fun postUser(newUser: NewUser) = api.postUser(newUser)
}

// NetModule.kt
@Provides @Singleton
fun providesOkHttpClient(cache: Cache, app: Application): OkHttpClient {
    val timeoutInSeconds = 90.toLong()
    val builder = OkHttpClient.Builder()
        .cache(cache)
        .addInterceptor(MyInterceptor(app))
        .connectTimeout(timeoutInSeconds, TimeUnit.SECONDS)
        .readTimeout(timeoutInSeconds, TimeUnit.SECONDS)

    when {
        BuildConfig.DEBUG -> {
            val loggingInterceptor = HttpLoggingInterceptor().apply {
                level = HttpLoggingInterceptor.Level.HEADERS
            }

            with(builder) {
                addInterceptor(loggingInterceptor)
                addNetworkInterceptor(StethoInterceptor())
            }
        }
    }

    return builder.build()
}

@Provides @Singleton
fun providesMoshi(): Moshi {
    val jsonApiAdapterFactory = ResourceAdapterFactory.builder()
        .add(TermsConditions::class.java)
        .add(AuthUser::class.java)
        .add(Unknown::class.java)
        .build()

    val builder = Moshi.Builder()
        .add(jsonApiAdapterFactory)
        .add(KotlinJsonAdapterFactory())
    return builder.build()
}

@Provides @Singleton
fun providesRetrofit(okHttpClient: OkHttpClient, moshi: Moshi): Retrofit {
    return Retrofit.Builder()
        // .addConverterFactory(ScalarsConverterFactory.create())
        .addConverterFactory(JsonApiConverterFactory.create(moshi))
        .addConverterFactory(MoshiConverterFactory.create(moshi))
        .addCallAdapterFactory(CoroutineCallAdapterFactory())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .baseUrl(baseUrl)
        .client(okHttpClient)
        .build()
}

// MyInterceptor.kt
class MyInterceptor @Inject constructor(private val app: Application) : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val initialRequest = chain.request()
        val finalRequest = setHeaders(initialRequest)
        return chain.proceed(finalRequest)
    }

    private fun setHeaders(initialRequest: Request): Request {
        return initialRequest.newBuilder()
            // .header("Content-Type", "application/vnd.api+json")
            .header("User-Agent", "MyApp v${BuildConfig.VERSION_NAME}")
            .build()
    }
}

// MyViewModel.kt
fun createUser() {
    userObserver = object : DisposableObserver<AuthUser>() {
        override fun onNext(authUser: AuthUser) {
            statusData.postValue(true)
        }

        override fun onError(e: Throwable) {
            Timber.w(e.localizedMessage)
            error.postValue(e.localizedMessage)
        }

        override fun onComplete() {
            // no-op
        }
    }

    userRepo.postUser(newUser)
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(userObserver)
}

// log1.txt Retrofit with ScalarsConverterFactory
2018-04-18 15:20:35.772 16491-17436/com.es0329.myapp D/OkHttp: --> POST https://api.es0329.com/v5/authenticated_users
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 259
    User-Agent: MyApp v1.5.1
    --> END POST
2018-04-18 15:20:36.278 16491-17436/com.es0329.myapp D/OkHttp: <-- 500 https://api.es0329.com/v5/authenticated_users (505ms)

// log2.txt Retrofit without ScalarsConverterFactory
2018-04-18 18:25:45.742 5017-6325/com.es0329.myapp D/OkHttp: --> POST https://api.es0329.com/v5/authenticated_users
    Content-Type: application/json; charset=UTF-8
    Content-Length: 311
    User-Agent: MyApp v1.5.1
    --> END POST
2018-04-18 18:25:45.868 5017-6325/com.es0329.myapp D/OkHttp: <-- 500 https://api.es0329.com/v5/authenticated_users (125ms)

// log3.txt after modifying JsonApiConverterFactory's `MediaType`
2018-04-18 20:35:47.322 19368-19931/com.es0329.myapp D/OkHttp: --> POST https://api.es0329.com/v5/authenticated_users
    Content-Type: application/vnd.api+json
    Content-Length: 268
    User-Agent: MyApp v1.5.1
    --> END POST
2018-04-18 20:35:49.058 19368-19931/com.es0329.myapp D/OkHttp: <-- 200 https://api.es0329.com/v5/authenticated_users (1735ms)

答案 1 :(得分:0)

在log4j中会执行以下操作,因此我也假设log4j2:

  Logger hlogger = Logger.getLogger("org.hibernate.stat");
  SimpleLayout layout = new SimpleLayout();
  ConsoleAppender consoleAppender = new ConsoleAppender(layout);
  consoleAppender.setEncoding("UTF-8");
  hlogger.addAppender(consoleAppender);
  hlogger.setLevel(Level.DEBUG);