0

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 &lt;%X{userId}&gt;&lt;%X{customerID}&gt;&lt;%X{oid}&gt; [%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の異なるファイルが作成されました.

したがって、質問は次のとおりです。新しいファイルを作成するだけでなく、「ロールバックする」としましょう。

私のアプローチは間違っていましたか?

ありがとう。

4

0 に答える 0