Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Spring4D的日志机制是线程安全的吗?(我想单位是Spring.Logging.*)_Multithreading_Delphi_Logging_Spring4d - Fatal编程技术网

Multithreading Spring4D的日志机制是线程安全的吗?(我想单位是Spring.Logging.*)

Multithreading Spring4D的日志机制是线程安全的吗?(我想单位是Spring.Logging.*),multithreading,delphi,logging,spring4d,Multithreading,Delphi,Logging,Spring4d,Spring4D的日志机制是线程安全的吗?(我想单位是Spring.Logging.*) 例如,多个线程能否从以下容器解析并使用ILogger的实现 uses System.SysUtils, Spring.Container, Spring.Logging, Spring.Logging.Appenders, Spring.Logging.Controller, Spring.Logging.Loggers; var Container: TContainer;

Spring4D的日志机制是线程安全的吗?(我想单位是Spring.Logging.*)

例如,多个线程能否从以下容器解析并使用
ILogger
的实现

uses
  System.SysUtils,
  Spring.Container,
  Spring.Logging,
  Spring.Logging.Appenders,
  Spring.Logging.Controller,
  Spring.Logging.Loggers;

var
  Container: TContainer;
  TextLogAppender: TTextLogAppender;
  FileLogAppender: TFileLogAppender;
  LoggerController: TLoggerController;
  LoggerInThread1: ILogger;
  LoggerInThread2: ILogger;
begin
  TextLogAppender := TTextLogAppender.Create;
  FileLogAppender := TFileLogAppender.Create;
  FileLogAppender.FileName := 'Log.txt';
  LoggerController := TLoggerController.Create;
  LoggerController.AddAppender(TextLogAppender as ILogAppender);
  LoggerController.AddAppender(FileLogAppender as ILogAppender);

  Container := TContainer.Create;
  try
    Container.RegisterInstance<ILoggerController>(LoggerController);
    Container.RegisterType<ILogger, TLogger>;

    Container.Build;

    LoggerInThread1 := Container.Resolve<ILogger>;
    LoggerInThread2 := Container.Resolve<ILogger>;

    {$Region 'threaded code'}
    LoggerInThread1.Info('Hello from Thread 1!');
    LoggerInThread2.Info('Hello from Thread 2!');
    {$EndRegion}
  finally
    Container.Free;
  end;
end;
使用
System.SysUtils,
弹簧,容器,
春天,伐木,
Spring.Logging.Appenders,
Spring.Logging.Controller,
Spring.Logging.Loggers;
变量
容器:t容器;
TextLogAppender:TTextLogAppender;
FileLogAppender:TFileLogAppender;
LoggerController:TLoggerController;
LoggerInThread1:ILogger;
LoggerInThread2:ILogger;
开始
TextLogAppender:=TTextLogAppender.Create;
FileLogAppender:=TFileLogAppender.Create;
FileLogAppender.FileName:=“Log.txt”;
LoggerController:=TLoggerController.Create;
LoggerController.AddAppender(TextLogAppender作为ILogAppender);
LoggerController.AddAppender(FileLogAppender作为ILogAppender);
容器:=t容器。创建;
尝试
容器注册状态(LoggerController);
Container.RegisterType;
容器。构建;
LoggerInThread1:=容器。解析;
LoggerInThread2:=Container.Resolve;
{$Region'threaded code'}
LoggerInThread1.Info('Hello from Thread 1!');
LoggerInThread2.Info('Hello from Thread 2!');
{$EndRegion}
最后
集装箱。免费;
结束;
结束;

使用分支(当前)。

TFileLogAppender
可以从多个线程同时使用,因为它派生自
TStreamLogAppender
,后者在其
DoSend
方法中使用
TCriticalSection
,以避免与多线程相关的问题


TTextLogAppender
在实现
DoSend
时不使用
TCriticalSection
的实例。因此,我认为它不应该同时在多线程中工作。

TTextLogAppender不是线程安全的,因为它使用文件I/O(也称为Writeln)。即使将一个CS放入到该文件中也无法解决任何问题,因为可能会有多个appender写入同一个文件。这就是为什么TStreamLogAppender也是唯一线程安全的,如果您没有另一个使用相同流。总之:
TFileLogAppender
是线程安全的,因为它使用了来自
TStreamLogAppender
的CS,并且没有将流暴露给其他用途的风险,它还使用
fmShareDenyWrite
访问,禁止其他人写入同一文件
TTextLogAppender
是线程安全的,只要您将其用于stdout/stderr(可能依赖于平台)。其他特定于平台的appender也应该是安全的(也依赖于平台)。我必须纠正自己,经过几次测试
TTextLogAppender
由于内部RTL实现而不是线程安全的。我将为1.2添加锁定,如果日志记录是唯一使用
ErrOutput
的日志记录,那么它将修复这个问题。我为你创建了一个跟踪。