MDC / ThreadContextを使用してユーザーごとに異なるファイルに各ユーザーアクションを記録するアペンダーを作成して、ユーザー名を保存し、後でそれを使用してファイルに名前を付けたいと考えています。
したがって、User1 の場合は「web_debug_user1_yyyy-MM-DD」、user2 の場合は「web_debug_user2_yyyy-MM-DD」になります。
これらのユーザーは同時にアプリケーションにログインできます。
構成の関連部分は次のとおりです。
<Properties>
<Property name="logPath">/data/logs</Property>
<Property name="rollingFileName">web_debug</Property>
<Property name="rollingFileNameError">web_Error</Property>
<Property name="patternLog">%d %-5p [%c] %m [SID: %X{sessionId}]%n</Property>
<Property name="patternLogUser">%d %-5p <%X{userId}><%X{customerID}><%X{oid}> [%c] %m [SID: %X{sessionId}]%n</Property>
</Properties>
<Appenders>
<RollingFile name="rollingFileUser"
filePattern="${logPath}/${rollingFileName}_$${ctx:userId}%d{yyyy-MM-dd}_%i.txt">
<PatternLayout pattern="${patternLogUser}" />
<Policies>
<UserLoggingTriggerPolicy />
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
<DirectWriteRolloverStrategy />
</RollingFile>
また、ユーザー イベントが起動されるたびにマネージャーの fileName プロパティを設定するカスタム ポリシー UserLoggingTriggeringPolicy を次に示します。
@Plugin(name = "UserLoggingTriggerPolicy", category = "Core")
public class UserLoggingTriggerPolicy implements TriggeringPolicy {
private RollingFileManager manager;
private String typelog;
private File[] debugFilesUser;
@Override
public void initialize(RollingFileManager manager) {
this.manager = manager;
this.typelog = manager.getFileName().contains("debug") ? "debug" : "Error";
this.debugFilesUser = null;
}
@Override
public boolean isTriggeringEvent(LogEvent arg0) {
return isRolling();
}
public boolean isRolling() {
boolean roll = false;
if (!this.manager.getFileName().contains(MDC.get("userId"))) {
((DirectFileRolloverStrategy) manager.getRolloverStrategy()).clearCurrentFileName();
((DirectFileRolloverStrategy) manager.getRolloverStrategy()).getCurrentFileName(manager);
}
File f = new File(this.manager.getFileName());
File folder = new File(f.getParent());
if (debugFilesUser == null) {
getFiles(folder);
}
if ((debugFilesUser.length != 0 && debugFilesUser[debugFilesUser.length - 1].length() / 1024 / 1024 > 10)
|| !f.exists()) {
debugFilesUser = null;
roll = true;
}
return roll;
}
private void getFiles(File folder) {
debugFilesUser = folder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if (name.contains(MDC.get("userId")) && name.contains(typelog)) {
return true;
}
return false;
}
});
}
@PluginFactory
public static UserLoggingTriggerPolicy createPolicy() {
return new UserLoggingTriggerPolicy();
}
}
FileManager の FileName を変更しても同じ OutputStream を指しているため、アプリに最初にログインしたユーザーに属するファイルにすべての異なるユーザー メッセージを記録するだけでは十分ではないようです。いくつかのデバッグの後、OutputStream は 2 つの状況でのみ変化することがわかりました: FileManager と RollOver の初期化。次に、現在のユーザーが変更されたときにカスタムポリシーでロールオーバーを強制しましたが、ロールごとに新しいファイルが作成され、以前の既存のファイルには書き込まれなかったため、10分間で20〜30の異なるファイルが作成されました.
したがって、質問は次のとおりです。新しいファイルを作成するだけでなく、「ロールバックする」としましょう。
私のアプローチは間違っていましたか?
ありがとう。