足球战术->组合进攻之composite篇

博客介绍了Composite模式在球员进攻组合中的应用。该模式可简化教练指挥,便于在原战术中加入新队员或组合,但无法限制特定队员或组合加入。文中还给出了相关代码示例,组件可为组合或队员。

接上回:

http://www.youkuaiyun.com/develop/read_article.asp?id=11120

最有效的进攻方法是几个球员组合成composite来进攻,
这个composite又可以和其他球员和composite组合成
新的composite,如此递归...Composite模式简化了
教练(client)的指挥,因为他不用考虑某个进攻模块
是单个队员还是composite,而且也容易在原战术上
加入新增加的队员或composite,但是使用起来会出现
你不希望某个进攻组合中有某个队员或组合时,你无法
限制他们,只有在比赛进行中灵活运用。
代码如下:
class 组合;

class 组件{
public:
    virtual 组合* 得到组合(){return 0;}
};

class 组合:public 组件{
public:
    void 添加(组件*);
    virtual 组合* 得到组合(){return this;}
};

class 队员:public 组件{
};

组合* a组合=new 组合;
队员* a队员=new 队员;

组件* a组件;
组合* test;

a组件=a组合;
if(test=a组件->得到组合()){
   test->添加(new 队员);
}

a组件=a队员;

if(test=a组件->得到组合()){
   test->添加(new 队员);
}

注:组件为一个组合或队员。

 

<log4net OverdueDays="10"> <root> <!--level value="DEBUG"/--> <level value="ALL"/> <!--自定义日志输出类型--> <!--appender-ref ref="ErrorRollingFileAppender"/--> <!--appender-ref ref="DebugRollingFileAppender"/--> <!--appender-ref ref="InfoRollingFileAppender"/--> <!--根据log级别记录到不同的日志文件--> <appender-ref ref="DebugLogger" /> <appender-ref ref="InfoLogger" /> <!--<appender-ref ref="WarnLogger" />--> <appender-ref ref="ErrorLogger" /> <!--<appender-ref ref="FatalLogger" />--> </root> <!--自定义日志输出参数--> <!--Debug文件日志记录器--> <appender name="DebugLogger" type="log4net.Appender.RollingFileAppender"> <!--日志存放文件夹--> <file value="Log\parm_Logs\"/> <!--是否追加到文件--> <appendToFile value="true" /> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--使用UTF-8编码--> <Encoding value="UTF-8" /> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <maxSizeRollBackups value="10"/> <!--是否只写到一个文件中--> <StaticLogFileName value="false"/> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value="Date" /> <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--> <param name="datePattern" value="yyyy-MM-dd'.log'"/> <!--过滤设置,LevelRangeFilter为使用的过滤器。--> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="DEBUG" /> <levelMax value="DEBUG" /> </filter> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%d{HH:mm:ss }%message %newline"/> <!-- 输出格式 日期,日志级别,消息,换行--> <!--param name="ConversionPattern" value="%date [%-5p] %message%n" /--> </layout> </appender> <!--InfoLog文件日志记录器--> <appender name="InfoLogger" type="log4net.Appender.RollingFileAppender"> <!--日志存放文件夹--> <file value="Log\operation_Log\"/> <!--是否追加到文件--> <appendToFile value="true" /> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--使用UTF-8编码--> <Encoding value="UTF-8" /> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <maxSizeRollBackups value="10"/> <!--是否只写到一个文件中--> <StaticLogFileName value="false"/> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value="Date" /> <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--> <param name="datePattern" value="yyyy-MM-dd'.log'"/> <!--过滤设置,LevelRangeFilter为使用的过滤器。--> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="INFO" /> <levelMax value="INFO" /> </filter> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <!-- 输出格式 日期,日志级别,消息,换行--> <!--param name="ConversionPattern" value="%date [%-5p] %message%n" /--> <conversionPattern value="%d{HH:mm:ss }%message %newline"/> </layout>这个为什么在文件夹中存储日志个数远超10个
最新发布
12-05
<think> 首先,用户的问题是关于log4net配置中,尽管设置了maxSizeRollBackups为10,但文件夹中存储的日志文件个数却远超10个。我需要基于提供的引用内容来回答这个问题。 回顾引用: - 引用[1]提到日志文件大小达到10MB后滚动,最多保留5个备份文件。 - 引用[2]讨论日志上下文和运行时动态调整日志级别。 - 引用[3]展示了一个日志帮助类的代码,包括配置和使用。 用户的具体问题是:maxSizeRollBackups设置为10,但实际日志文件超过10个。我需要找出原因。 可能的常见原因: 1. **配置错误**:maxSizeRollBackups可能没有正确设置或应用。确保配置文件中这个值被正确读取。 2. **滚动策略**:log4net的滚动策略可能有多种,如大小滚动、日期滚动等。如果配置了日期滚动(如每天滚动),那么日志文件数量可能会超过maxSizeRollBackups,因为每个日期都会产生新文件。 3. **多个日志记录器**:如果有多个日志记录器(loggers)配置了相同的appender,每个可能有自己的备份文件。 4. **文件命名和滚动行为**:log4net的文件滚动机制可能导致文件积累,特别是如果maxSizeRollBackups只限制每个滚动组的备份数,但如果有多个组。 5. **配置未加载**:代码中没有正确加载配置文件,导致默认行为生效。 从引用中提取相关信息: - 引用[1]说:"日志文件的大小会在达到 10MB 后进行滚动,最多保留 5 个备份文件。" 这表明maxSizeRollBackups可能设置为5。 - 但在用户的问题中,提到设置为10。用户说:"maxSizeRollBackups设置为10",所以可能是用户自己的配置。 - 引用[3]展示了配置代码:log4net.Config.XmlConfigurator.Configure(); 这用于初始化配置。 关键点:用户需要检查配置文件是否正确设置maxSizeRollBackups。另外,log4net的滚动策略是基于大小和日期的组合。 常见原因分析: - **日期滚动**:如果配置了日期模式(如%d{yyyy-MM-dd}),那么每个日期都会产生新文件,maxSizeRollBackups只限制每个日期的备份数,而不是总文件数。 - **大小滚动**:pure size-based rolling with maxSizeRollBackups should limit the total number to maxSizeRollBackups + 1 (current file). - **文件计数**:maxSizeRollBackups设置的是备份文件数,不包括当前活动文件。所以总文件数应该是maxSizeRollBackups + 1。 - 如果超过,可能是配置了多个appenders或日志记录器。 用户场景:用户设置了maxSizeRollBackups=10,但文件数远超10。所以可能的原因: 1. 日期滚动:如果使用日期模式,即使大小滚动开启,每个新日期会创建新文件,备份计数是每个文件序列独立的。 2. 配置未生效:代码没有加载正确配置。 3. 多个实例:应用程序有多个进程或实例,每个都写日志,导致文件积累。 4. 日志级别或过滤器:但这主要影响内容,不是文件数。 解决方案建议: - 检查配置文件:确保maxSizeRollBackups正确设置。 - 确认滚动策略:是否包含日期模式?例如,如果配置了%d{yyyyMMdd},那么文件会按日期滚动。 - 代码初始化:确保log4net初始化正确。 - 查看实际文件:检查文件名模式,看是否有日期部分。 从引用[3],有代码示例: - LogHelper类使用log4net.LogManager.GetLogger。 - 配置通过log4net.Config.XmlConfigurator.Configure加载。 在回答中: - 使用中文。 - 结构清晰,逐步解释。 - 添加引用标识,如[^1], [^2], [^3]。 - 生成相关问题。 响应结构: 1. 确认问题。 2. 解释可能原因。 3. 提供检查步骤。 4. 建议解决方案。 5. 生成相关问题。 生成相关问题: - 如何正确配置log4net的滚动策略? - 如何动态调整log4net的日志级别? - log4net中如何处理多个日志文件积累的问题? </think> ### log4net配置中日志文件数远超设置的原因分析 用户的问题是关于log4net配置中,尽管设置了`maxSizeRollBackups=10`,但文件夹中实际存储的日志文件个数却远超10个。这通常是由于log4net的滚动策略配置或运行时行为导致的。下面我将逐步分析原因,并提供解决方案。分析基于log4net的常见行为机制和相关引用内容。 #### 1. **可能的原因分析** - **日期滚动策略干扰**: - 如果配置中同时启用了日期滚动(如`<datePattern>`),log4net会基于日期创建新文件序列。例如,配置`<rollingStyle>Composite</rollingStyle>`(复合滚动)时,每个新日期(如每天)都会启动一个新的文件序列,每个序列独立应用`maxSizeRollBackups`限制。结果可能是多个日期序列的总文件数远超10个[^2]。 - 示例:如果日志文件按天滚动(如`log_20231001.txt`, `log_20231002.txt`),且每个序列保留10个备份,那么10天后文件总数可达100个。 - **配置未正确加载或覆盖**: - 代码中未正确初始化log4net配置,导致默认行为生效(默认可能无限保留文件)。引用[3]强调需通过`log4net.Config.XmlConfigurator.Configure()`加载配置,如果此步骤遗漏或配置文件路径错误,设置可能无效[^3]。 - 运行时动态调整日志级别或其他参数(如引用[2]所述)可能意外修改滚动行为,但此类操作需显式代码干预,通常不是主要原因[^2]。 - **多个Appender或Logger实例**: - 如果配置了多个FileAppender(例如,为不同日志级别设置独立Appender),每个Appender会维护自己的文件序列。`maxSizeRollBackups`仅作用于单个Appender,多个Appender会导致文件数倍增[^1]。 - 示例:错误日志和普通日志分开存储时,每个Appender保留10个备份,总文件数可达20个以上。 - **文件滚动计数机制误解**: - `maxSizeRollBackups=10`表示最多保留10个备份文件,不包括当前活动文件。因此,理论最大文件数为11(10备份 + 1当前)。若远超此数,通常是滚动策略问题。 - 如果`maximumFileSize`设置过大或日志写入频繁,文件滚动可能延迟,但这对文件总数影响较小。 #### 2. **诊断和解决步骤** 逐步检查配置和代码,以定位问题: - **步骤1: 检查配置文件** 确保`log4net.config`中滚动策略正确: ```xml <appender name="FileAppender" type="log4net.Appender.RollingFileAppender"> <file value="logs\log.txt" /> <appendToFile value="true" /> <rollingStyle value="Composite" /> <!-- 或 Size --> <datePattern value="yyyyMMdd" /> <!-- 若存在日期模式,需注意 --> <maxSizeRollBackups value="10" /> <!-- 确认此处值为10 --> <maximumFileSize value="10MB" /> <!-- 大小滚动触发条件 --> <staticLogFileName value="false" /> <!-- 通常设为true以避免命名冲突 --> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> ``` - 如果`<datePattern>`存在,考虑移除或改用纯大小滚动(`<rollingStyle>Size</rollingStyle>`)。 - 验证配置路径:在代码中指定配置文件路径(如引用[3]的`SetConfig(FileInfo configFile)`方法),避免默认配置生效[^3]。 - **步骤2: 验证代码初始化** 确保log4net在应用程序启动时正确初始化,如引用[3]所示: ```csharp // 在程序入口(如Main方法)调用 LogHelper.SetConfig(); // 或指定配置文件路径 ``` 添加调试代码检查配置是否加载: ```csharp var repository = LogManager.GetRepository(); foreach (var appender in repository.GetAppenders()) { if (appender is RollingFileAppender rfa) { Console.WriteLine($"MaxBackups: {rfa.MaxSizeRollBackups}"); } } ``` - **步骤3: 检查运行时行为** - 监控文件生成:运行应用后观察日志文件名。如果文件名包含日期(如`log_20231001.1.txt`),表明日期滚动生效。 - 避免多进程冲突:确保无多个应用实例同时写入同一日志目录,这可能因文件锁导致意外创建新文件。 - **步骤4: 优化配置建议** - 若需限制总文件数,改用纯大小滚动: ```xml <rollingStyle value="Size" /> <datePattern value="" /> <!-- 清空日期模式 --> ``` - 设置`<preserveLogFileNameExtension value="true" />`防止文件名变化导致计数错误。 #### 3. **预防措施** - 定期审查配置:使用工具如`log4net.Config.XmlConfigurator.ConfigureAndWatch()`自动重载配置变更[^1]。 - 日志清理脚本:添加外部任务(如Windows计划任务)定期清理旧文件,作为冗余保障。 - 测试配置:在开发环境模拟高负载日志写入,验证文件数是否符合预期。 如果以上步骤仍无法解决,请提供配置文件片段和日志目录结构示例,以便进一步分析[^1][^3]。 --- ### 相关问题 1. 如何正确配置log4net以实现纯大小滚动策略? 2. log4net中如何动态监控和调整日志滚动行为? 3. 在多个应用实例下,如何避免log4net日志文件冲突? [^1]: 日志文件的大小会在达到 10MB 后进行滚动(即创建新的日志文件),最多保留 5 个备份文件。 [^2]: log4net 支持运行时动态调整日志级别(需代码配合)。 [^3]: 在代码中初始化 log4net 并通过 `log4net.Config.XmlConfigurator.Configure()` 加载配置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值