標記の件について、他スレッドからログインスタンスが初期化されてしまい、1スレッド=1ログインスタンスの状態を保ちたいです。
以下、出来ている部分を記載しましたので、ご確認下さい。
クライアントから接続依頼がきたらログインスタンスを生成し、
ファイル名に年月日とポート番号を指定しています。
接続ができたら対象のポート番号より、別の接続を確立させて、
処理依頼を待機します。
マルチスレッドで起動する事を許容しておりますが、
ログ出力先だけマルチスレッド制御出来ずにいます。
例)
接続依頼A
↓
Aポートログファイル生成(ログインスタンス生成)
↓
接続依頼B
↓
Bポートログファイル生成(ログインスタンス生成)
↓
処理依頼A
↓
Aポートログファイルへ処理内容出力:×
→これがBポートログファイルに出力されます。
↓
処理依頼B
↓
Bポートログファイルへ処理内容出力:○
以下、主なソースコードです。(例外等割愛)
共通のログ生成クラス public static ILog GetLogger(string ProcessName, string SubFolder = "") { ILog newLogger = null; log4net.Config.XmlConfigurator.Configure(new FileInfo(LOGCONFIGPATH)); newLogger = log4net.LogManager.GetLogger(ProcessName); log4net.Repository.Hierarchy.Logger logger = (log4net.Repository.Hierarchy.Logger)newLogger.Logger; if (logger.Parent.Appenders.Count != 0) { log4net.Appender.RollingFileAppender appender; appender = (log4net.Appender.RollingFileAppender)logger.Parent.Appenders[0]; appender.DatePattern = "'_'yyyyMMdd'.log'"; if (SubFolder.Length == 0) { appender.File = @"..\Log\" + ProcessName; } else { appender.File = @"..\Log\" + SubFolder + @"\" + ProcessName; } appender.ActivateOptions(); } return newLogger; } LogConfig.xml(一部抜粋) <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="" /> <param name="AppendToFile" value="true" /> <param name="MaxSizeRollBackups" value="10" /> <param name="MaximumFileSize" value="10000KB" /> <param name="RollingStyle" value="date " /> <param name="StaticLogFileName" value="false" /> <param name="DatePattern" value="" /> <layout type="log4net.Layout.PatternLayout"> <param name="conversionPattern" value="%d{yy/MM/dd HH:mm:ss}|%-5p|%C[%4L]|%c[%5t]|%m%n" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="RollingFileAppender" /> <appender-ref ref="ConsoleAppender" /> </root> ログインスタンス保持して出力する部分 (クラス変数宣言) private ILog gLog; (接続依頼がきたらロガー取得) gLog = GSSCommon.GetLogger(SERVICE_NM + port, subDir); gLog.Info("接続確認"); ※ここでは対象のログに出力されている (処理依頼がきたら処理開始) ※ここで最後にGetLoggerしたログファイルに出力されてる gLog.Info("処理開始"); ※以下、その他補足です。 ・スレッドIDを出力してもスレッドIDは異なっていたので、マルチスレッドとしての仕組みは問題なさそうです。 ・処理依頼直後にGetLoggerを再度行えば、傍目から見ればスレッド別に出力されますが、 処理中に別スレッドがGetLoggerしたら出力内容がログファイル別にぐちゃぐちゃになってそうです。 ・起動するスレッド数は50~100程を予定し、1プロセスで20~50程度のスレッド数で予定してます。 ・クラス内のログインスタンスを一度のGetLoggerで他スレッドから上書されないようにしたいです。 以上となりますが、何かご指摘等ありましたら、よろしくお願い致します。
回答4件
あなたの回答
tips
プレビュー