15

実行時にlog4jで構成されているすべてのアペンダーのリストを取得することは可能ですか?

シナリオをもう少し具体化します。次の構成を前提として、すべてのアペンダー(stdoutおよびaltstdout)を取得するにはどうすればよいですか?

log4j.rootLogger=error, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.altstdout=org.apache.log4j.ConsoleAppender
log4j.appender.altstdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.altstdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
4

4 に答える 4

17

すべてのロガー用に構成されたすべてのアペンダーにアクセスしたい場合は、次のようにする必要があります

for (Enumeration loggers=LogManager.getCurrentLoggers(); loggers.hasMoreElements(); )  {
    Logger logger = (Logger) loggers.nextElement();
    for (Enumeration appenders=logger.getAllAppenders(); appenders.hasMoreElements(); )  {
        Appender appender = (Appender) appenders.nextElement();
        ...

log4jにLogManager.getAllAppenders()のようなメソッドがない理由はわかりませんが、
不利に見えます。

于 2013-06-11T10:47:51.843 に答える
0

これはあなたが必要とするものの1つです

log4jメソッドgetAllAppenders

于 2012-12-24T18:51:10.610 に答える
0

理解するのに少し時間がかかったものを追加したいと思います。下の図(ここからコピーしたもの)を見ると、ロガーcom.foo.barがルートロガーのFileAppenderに出力されても、そのアペンダーリストはnullのままであることがわかります。したがって、ロガーがメソッドで書き込むすべてのアペンダーを取得することはできませんlogger.getAllAppenders()

ここに画像の説明を入力してください

このためには、すべての親とルートロガーを別々に繰り返す必要があります。ルートロガーを反復処理できないためlogger.getParent()(ルートロガーはnullを返します-getParent()のドキュメントを参照してください)。私の知る限り、rootLoggersのアペンダーに個別にアクセスする必要があります。Logger.getRootLogger().getAllAppenders().

于 2015-11-25T08:11:03.807 に答える
0

Log4jの実用的なソリューション1:

注:getAllAppendersはアクティブなログのみを取得します。log4j.xml構成ファイルで定義されているファイルの完全なリストではありません。

すべてのログファイルにrwxrwxrwx権限を設定するためにこれを実現する方法は次のとおりです。

@SuppressWarnings("unchecked")
public static <E> E safeCastNoException(Object o, Class<E> target)
{
  if(target.isInstance(o)) return (E)o;
  return null;
}
    {

        URL file;
        try
        {
            LogManager.resetConfiguration();
            file = new URL("file:" + Log4jXMLConfigFileName);
            // We override DOMConfigurator to catch Appender settings
            // in parseAppender and rework file rights access
            new DOMConfigurator()
            {
                @Override
                protected Appender parseAppender(Element appenderElement)
                {
                    Appender a = super.parseAppender(appenderElement);

                    FileAppender fileAppender = safeCastNoException(a, FileAppender.class);
                    if( fileAppender != null )
                    {
                        String filePath=fileAppender.getFile();

                        Path pathTofile = FileSystems.getDefault().getPath(filePath);
                        try
                        {
                            // Create the empty file with default permissions, etc.
                            Files.createFile(pathTofile);
                        }
                        catch(FileAlreadyExistsException x)
                        {
                            System.err.format("file named %s already exists, no need to recreate%n", pathTofile);
                        }
                        catch(Exception x)
                        {
                            // Some other sort of failure, such as permissions.
                            System.err.format("createFile error: %s%n", x);
                        }

                        try
                        {
                            //using PosixFilePermission to set file permissions 777
                            Set<PosixFilePermission> perms = new HashSet<PosixFilePermission>();
                            //add owners permission
                            perms.add(PosixFilePermission.OWNER_READ);
                            perms.add(PosixFilePermission.OWNER_WRITE);
                            //perms.add(PosixFilePermission.OWNER_EXECUTE);
                            //add group permissions
                            perms.add(PosixFilePermission.GROUP_READ);
                            perms.add(PosixFilePermission.GROUP_WRITE);
                            //perms.add(PosixFilePermission.GROUP_EXECUTE);
                            //add others permissions
                            perms.add(PosixFilePermission.OTHERS_READ);
                            perms.add(PosixFilePermission.OTHERS_WRITE);
                            //perms.add(PosixFilePermission.OTHERS_EXECUTE);
                            System.out.println("Trying to set 666 posix rights to log file: " + pathTofile.toAbsolutePath().toString());
                            Files.setPosixFilePermissions(Paths.get(pathTofile.toAbsolutePath().toString()), perms);
                        }
                        catch(Exception x)
                        {
                            // Some other sort of failure, such as permissions.
                            System.err.format("chmod error: %s%n", x);
                        }
                    }
                    return a;
                }
            }.
            doConfigure(file, LogManager.getLoggerRepository());
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
于 2018-06-28T08:59:29.973 に答える