2017-03-10 10 views
0

私は2つのアプリケーションAとBを実行しています。Bはランタイムに依存しています。両方のアプリケーションにはログファイル名とその他の情報を含むlog4j2.xmlファイル。異なるlog4j2.xmlを持つ2つのアプリケーションが同じログファイルにログインしようとしています

Bにはプリインストールスクリプトがあり、Aの前に 'root'ユーザによって実行されます。独自のログファイルを作成します。b_log.log Aが起動すると、独自のログファイルを作成するのではなくb_log.logにログインしようとします。 Aは別のユーザー 'a_user'によって開始されます。だから、Aは 'root'によって作成されたb_log.logにアクセスしてログインすることができないので、 'permission denied'というエラーが出る。どちらのログファイルも、RollingRandomAccessFileアペンダを使用します。

両方のアプリケーションを別々のログファイルにログインさせるにはどうすればよいですか?別のlog4j2.xmlを提供することはできません。アプリケーションAの

log4j2.xml:アプリケーションBの

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="INFO"> 
    <Appenders> 
     <RollingRandomAccessFile name="ApplicationFile" fileName="${sys:logPath}/log_a.log" 
        filePattern="${sys:logPath}/log_a.log".%d{yyyy-MM-dd-HH}"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%-5level] (%t) %X{sessionId} %c{1}: %msg%n"/> 
      <Policies> 
       <TimeBasedTriggeringPolicy/> 
      </Policies> 
     </RollingRandomAccessFile> 
    </Appenders> 
    <Loggers> 
     <Root level="INFO"> 
      <AppenderRef ref="ApplicationFile"/> 
     </Root> 

     <!-- Loggers explicitly defined here, so their levels could be adjusted in runtime via JMX --> 
     <Logger name="com.xyz.a.package" level="INFO" /> 
    </Loggers> 
</Configuration> 

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="INFO"> 
    <Appenders> 
     <RollingRandomAccessFile name="LogB" fileName="${sys:logPath}/log_b.log" 
        filePattern="$${sys:logPath}/log_b.log.%d{yyyy-MM-dd-HH}"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%-5level] (%t) %X{sessionId} %c{1}: %msg%n"/> 
      <Policies> 
       <TimeBasedTriggeringPolicy/> 
      </Policies> 
     </RollingRandomAccessFile> 
    </Appenders> 
    <Loggers> 
     <Logger name="com.xyz.b.package" level="INFO" additivity="false"> 
      <AppenderRef ref="LogB"/> 
     </Logger> 
    </Loggers> 
</Configuration> 

アプリケーションAがb_logにアクセスすることができないことを例外:


    2017-03-12 07:42:37,197 main ERROR Cannot access RandomAccessFile java.io.FileNotFoundException: /app/env/Service/var/output/logs/log_b.log (Permission denied) java.io.FileNotFoundException: /app/env/Service/var/output/logs/log_b.log (Permission denied) 
      at java.io.RandomAccessFile.open0(Native Method) 
      at java.io.RandomAccessFile.open(RandomAccessFile.java:316) 
      at java.io.RandomAccessFile.(RandomAccessFile.java:243) 
      at java.io.RandomAccessFile.(RandomAccessFile.java:124) 
      at org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager$RollingRandomAccessFileManagerFactory.createManager(RollingRandomAccessFileManager.java:176) 
      at org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager$RollingRandomAccessFileManagerFactory.createManager(RollingRandomAccessFileManager.java:149) 
      at org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:73) 
      at org.apache.logging.log4j.core.appender.OutputStreamManager.getManager(OutputStreamManager.java:81) 
      at org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager.getRollingRandomAccessFileManager(RollingRandomAccessFileManager.java:82) 
      at org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.createAppender(RollingRandomAccessFileAppender.java:207) 
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
      at java.lang.reflect.Method.invoke(Method.java:498) 
      at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:132) 
      at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:918) 
      at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:858) 
      at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:850) 
      at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:479) 
      at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:219) 
      at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:231) 
      at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:496) 
      at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:566) 
      at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:582) 
      at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:217) 
      at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:152) 
      at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45) 
      at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194) 
      at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:122) 
      at org.apache.logging.log4j.jul.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:34) 
      at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:46) 
      at org.apache.logging.log4j.jul.LogManager.getLogger(LogManager.java:89) 
      at java.util.logging.LogManager.demandLogger(LogManager.java:551) 
      at java.util.logging.Logger.demandLogger(Logger.java:455) 
      at java.util.logging.Logger.getLogger(Logger.java:502) 
      at com.sun.jmx.remote.util.ClassLogger.(ClassLogger.java:55) 
      at sun.management.jmxremote.ConnectorBootstrap.(ConnectorBootstrap.java:846) 
      at sun.management.Agent.startAgent(Agent.java:257) 
      at sun.management.Agent.startAgent(Agent.java:447) 

    2017-03-12 07:42:37,209 main ERROR Unable to invoke factory method in class class org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender for element RollingRandomAccessFile. java.lang.reflect.InvocationTargetException 
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
+0

2つのアプリケーションで同じログファイルを使用するのは悪い方法です。 –

+0

ここに実際に質問は表示されません。あなたは何を知りたいですか? – rgoers

答えて

1

同じLog4j2構成ファイルを共有し、別のログファイルにログすることもできます。ファイルアペンダーのパスにシステムプロパティを設定し、各アプリケーションにプロパティの異なる値を指定します。

簡単な例は次のようになります。設定ファイルのルックアップを使用する方法について

<Appenders> 
    <File name="ApplicationLog" fileName="${sys:logPath}/app.log"/> 
</Appenders> 

情報はConfigurationページのProperty Substitutionセクションで見つけることができます。


更新:伐採ディレクトリがrootとして実行中のプロセスによって作成されたならば、他のユーザーとして実行されている他のプロセスは、おそらくそのディレクトリ内のファイルを作成する権限を持っていないことを 注...

これはLog4j2の問題ではありません。ターゲットディレクトリに適切な権限があることを確認する必要があります。


アップデート2: 問題を要約すると:アプリケーションBは、最初に実行され、b_log.logを作成します。次のアプリケーションAが実行されます。何らかの理由でアプリケーションAがアプリケーションBからLog4j2構成を取得し、アプリケーションAもb_log.logに(誤って)ログオンしようとしましたが、別のLog4j2構成を指定しましたが、を指定しました。これはアクセス許可のために失敗します。問題は、A にb_log.logに書き込むことはできませんが、そのファイルに書き込もうとしてはいけません。設定が間違っています。

上記が正しい場合、問題は、2番目のアプリケーション "A"が誤った構成を選択しないようにする方法です。これを行うには、2番目のアプリケーションをシステムプロパティー-Dlog4j.configurationFile=path/to/log4j2.xmlで開始し、使用する構成ファイルを正確に伝えます。

+0

ありがとうRemko。両方のアプリケーションで単一のログファイルを使用している場合は動作しています。これらのアプリケーションは異なっているので、私はロギングの設定を分けておくことを考えていました。これらのアプリケーションで異なるlog4j2.xmlを使用し、異なるログファイルにログインできるようにすることはできますか? –

+0

はい、もちろんです。それは非常に一般的です。 –

+0

お返事ありがとうございます。提案した解決策は機能していません。私は質問の両方のアプリケーションのlog4j2.xmlを追加しました。 –

関連する問題