【C#跨平台日志配置终极指南】:掌握5大核心技巧实现高效日志管理

C# 常用不同日志库的区别详解与示例 阅读详情

第一章:C#跨平台日志配置概述

在现代软件开发中,日志记录是保障系统稳定性和可维护性的关键环节。随着 .NET Core 和 .NET 5+ 的推出,C# 应用已全面支持跨平台运行,日志配置也需适应 Windows、Linux 和 macOS 等不同环境。为此,.NET 提供了统一的日志抽象——`Microsoft.Extensions.Logging`,允许开发者通过一致的 API 在多种平台上实现灵活的日志输出。

日志提供程序的选择

常见的日志提供程序包括:
  • Console:将日志输出到控制台,适用于调试和容器化部署
  • Debug:写入调试器输出,适合本地开发阶段
  • EventLog:仅限 Windows,写入系统事件日志
  • 第三方提供程序:如 Serilog、NLog、log4net,支持结构化日志和多目标输出

基础配置示例

以下代码展示了如何在 .NET 6+ 的通用主机中配置跨平台日志:
// Program.cs
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

var host = Host.CreateDefaultBuilder(args)
    .ConfigureLogging((context, logging) =>
    {
        // 清除默认提供程序
        logging.ClearProviders();
        
        // 添加控制台和调试日志(跨平台兼容)
        logging.AddConsole();
        logging.AddDebug();

        // 根据环境启用更详细的日志级别
        if (context.HostingEnvironment.IsDevelopment())
        {
            logging.SetMinimumLevel(LogLevel.Debug);
        }
    })
    .Build();

await host.RunAsync(); // 启动主机并监听日志输出
该配置利用 `CreateDefaultBuilder` 自动加载环境变量和配置文件,并通过 `ConfigureLogging` 方法精细化控制日志行为。日志级别(如 `LogLevel.Information`、`LogLevel.Warning`)可根据部署环境动态调整,确保生产环境中不会因过度日志影响性能。

配置来源对比

配置方式适用场景优点
代码内配置快速原型、简单应用直观,易于调试
appsettings.json生产环境、多环境切换无需重新编译,支持环境隔离
环境变量容器化部署(Docker/K8s)安全、灵活,与CI/CD集成良好

第二章:.NET日志抽象与核心组件详解

2.1 理解ILogger与ILoggerFactory接口设计

在.NET的日志抽象中,`ILogger` 与 `ILoggerFactory` 构成了日志系统的核心契约。`ILogger` 负责实际的日志写入操作,通过 `Log` 方法支持结构化日志输出,同时提供 `IsEnabled` 方法用于性能优化的级别判断。
核心接口职责划分
  • ILogger:定义日志写入行为,支持分级(如 Debug、Error)和结构化参数。
  • ILoggerFactory:负责创建 ILogger 实例,管理生命周期与类别区分。
public interface ILogger
{
    void Log<TState>(LogLevel level, EventId eventId, TState state,
        Exception? exception, Func<TState, Exception?, string> formatter);
    bool IsEnabled(LogLevel level);
}
上述代码展示了 `ILogger` 的核心方法。`Log` 方法接受日志级别、事件ID、状态对象与异常,并通过委托格式化输出,确保高性能与灵活性。`ILoggerFactory` 则通过 `CreateLogger(string categoryName)` 创建对应类别的日志器,实现关注点分离与资源复用。

2.2 配置LoggingBuilder实现多提供者支持

在现代应用开发中,日志记录常需同时输出到多个目标,如控制台、文件和远程服务。通过配置 `LoggingBuilder`,可轻松实现多提供者集成。
注册多个日志提供者
在 `Program.cs` 中使用 `ILoggingBuilder` 扩展方法添加不同提供者:

var builder = WebApplication.CreateBuilder(args);
builder.Logging
    .AddConsole()
    .AddDebug()
    .AddEventSourceLogger();
上述代码将控制台、调试输出和事件源日志提供者注册到系统中。`AddConsole()` 输出日志至终端,适用于开发与容器环境;`AddDebug()` 通过调试器监听日志,便于本地排查;`AddEventSourceLogger()` 支持高性能事件追踪。
提供者优先级与过滤
  • 日志条目会依次经过各提供者处理
  • 可通过配置节设置各提供者的最低日志级别
  • 利用 `ConfigureLogging` 实现条件注册,适配不同环境

2.3 使用内置日志提供程序进行调试输出

在开发 .NET 应用时,使用内置日志提供程序可以快速实现调试信息的输出。默认的 `ILogger` 接口与依赖注入系统无缝集成,支持多种日志级别,如 `Debug`、`Information`、`Warning` 等。
配置控制台日志输出
在 `Program.cs` 中启用默认日志记录:
var builder = WebApplication.CreateBuilder(args);
builder.Logging.AddConsole(); // 启用控制台日志
该代码将控制台作为日志输出目标,所有通过 `ILogger` 写入的日志都会显示在终端中,便于开发阶段实时查看。
日志级别与用途对照表
级别用途
Trace最详细的信息,通常用于诊断
Debug调试阶段的内部流程信息
Information常规操作记录,如请求处理

2.4 控制日志级别与过滤规则的实践策略

在复杂系统中,合理控制日志级别是保障可观测性与性能平衡的关键。通过动态调整日志级别,可在不重启服务的前提下聚焦关键信息。
日志级别配置示例
logging:
  level:
    root: INFO
    com.example.service: DEBUG
    org.springframework: WARN
上述配置将根日志级别设为 INFO,仅对业务服务模块启用 DEBUG 级别,第三方框架则抑制至 WARN,有效减少冗余输出。
基于条件的过滤规则
使用 MDC(Mapped Diagnostic Context)结合过滤器可实现上下文感知的日志过滤。例如,按用户 ID 或请求链路追踪号过滤:
  • 在请求入口设置 MDC.put("userId", userId);
  • 配置 Logback 的 ThresholdFilter 或 MarkerFilter 实现动态拦截
  • 通过 AOP 切面统一清理上下文,防止内存泄漏
多环境差异化策略
环境默认级别保留时长
开发DEBUG1天
生产WARN30天

2.5 构建可扩展的日志中间件管道

在现代服务架构中,日志中间件需具备高可扩展性与低侵入性。通过链式调用模式,可将多个日志处理单元串联,实现灵活组合。
中间件接口设计
定义统一的处理接口,便于后续扩展:
type LoggerMiddleware func(http.Handler) http.Handler

func LoggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("Request: %s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
    })
}
该函数接收一个处理器并返回增强后的处理器,记录请求方法与路径,适用于通用访问日志。
管道组装策略
使用切片存储中间件,按序封装:
  • LoggingMiddleware:记录基础请求信息
  • MetricsMiddleware:采集响应耗时指标
  • TraceMiddleware:注入分布式追踪ID
最终通过循环叠加,形成完整的处理链条,提升模块化程度与维护效率。

第三章:主流日志框架集成与选型分析

3.1 Serilog在跨平台应用中的结构化日志优势

Serilog 在跨平台 .NET 应用中提供一致的结构化日志记录能力,尤其适用于运行在 Linux、Windows 和容器环境中的微服务架构。
结构化日志的核心价值
与传统文本日志不同,Serilog 以 JSON 格式记录日志事件,天然支持字段化查询。例如:
Log.Information("处理订单 {OrderId},用户 {UserId},金额 {Amount}", orderId, userId, amount);
该语句生成结构化日志条目,其中 OrderId、UserId 和 Amount 作为独立字段存储,便于在 Elasticsearch 或 Seq 等系统中进行高效过滤与聚合分析。
跨平台输出适配
通过 Sink 插件机制,Serilog 可将日志写入多种目标,包括控制台、文件、数据库和云服务:
  • Console:开发调试时实时查看
  • File (JSON):持久化存储用于审计
  • Seq / Application Insights:集中式监控分析
这种灵活性确保了从本地开发到 Kubernetes 集群部署的日志一致性。

3.2 NLog的高性能异步写入机制实战

NLog通过异步包装器实现高性能日志写入,避免主线程阻塞。其核心在于将日志操作从调用线程解耦,交由后台线程批量处理。
异步配置示例
<targets async="true">
  <target xsi:type="File" name="file" fileName="logs/app.log" />
</targets>
上述配置启用异步写入,NLog自动封装目标为AsyncTargetWrapper,默认缓冲区大小为1000条,超时时间为1秒。
关键参数说明
  • queueLimit:队列最大容量,超出后新日志可能被丢弃
  • overflowAction:溢出策略,可设为Grow或Discard
  • timeToSleepBetweenBatches:批处理间隔,降低I/O频率
该机制显著提升吞吐量,尤其适用于高并发场景下的日志记录需求。

3.3 Log4Net与现代.NET项目的兼容性优化

适配.NET Core/.NET 5+
尽管Log4Net最初为传统.NET Framework设计,但通过配置调整和依赖注入集成,可在现代.NET项目中稳定运行。关键在于使用Microsoft.Extensions.Logging抽象层桥接日志输出。
public void ConfigureServices(IServiceCollection services)
{
    services.AddLogging(builder =>
    {
        builder.SetMinimumLevel(LogLevel.Information);
        builder.AddLog4Net("log4net.config", watch: true);
    });
}
上述代码将Log4Net注册为日志提供程序,log4net.config为配置文件路径,watch: true启用文件变更监听,实现动态重载。
常见兼容问题与解决方案
  • 异步上下文丢失:使用ThreadContext或LogicalThreadContext保存请求级数据
  • 属性占位符不解析:确保调用XmlConfigurator.Configure()正确加载配置
  • 性能瓶颈:避免频繁I/O操作,推荐结合异步追加器(如AsyncForwardingAppender)

第四章:跨平台环境下的高级配置策略

4.1 基于环境变量的动态日志配置切换

在微服务架构中,不同部署环境对日志级别和输出格式有差异化需求。通过读取环境变量,可实现运行时动态调整日志行为。
配置示例
package main

import (
	"log"
	"os"
)

func init() {
	level := os.Getenv("LOG_LEVEL")
	if level == "" {
		level = "INFO"
	}
	log.Printf("日志级别设置为: %s", level)
}
上述代码从环境变量 LOG_LEVEL 中读取日志级别,若未设置则使用默认值 INFO。该方式支持在开发、测试、生产环境中灵活控制日志输出。
常见环境变量对照表
环境LOG_LEVELOUTPUT_FORMAT
开发DEBUGtext
生产WARNjson

4.2 在Docker容器中持久化与收集日志

在容器化环境中,日志的持久化与集中收集是保障系统可观测性的关键环节。默认情况下,Docker使用`json-file`驱动将容器日志写入本地文件,但这些日志会随容器删除而丢失。
配置日志驱动
可通过启动容器时指定日志驱动实现持久化输出:
docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx
上述命令限制单个日志文件最大为10MB,最多保留3个归档文件,防止磁盘被耗尽。
集中式日志收集方案
生产环境推荐使用`fluentd`或`syslog`驱动将日志转发至中心化系统:
docker run -d \
  --log-driver fluentd \
  --log-opt fluentd-address=localhost:24224 \
  myapp
该配置将日志实时推送至Fluentd服务,便于后续通过Elasticsearch和Kibana进行分析与可视化展示。
  • 本地日志易丢失,不适用于故障排查
  • 结构化日志更利于机器解析与告警触发
  • 统一日志格式可提升多服务联调效率

4.3 利用Configuration API实现JSON配置热更新

在微服务架构中,配置的动态更新能力至关重要。通过 Configuration API,系统可在不重启服务的前提下实时加载最新的 JSON 配置。
监听机制与事件驱动
API 提供基于 Watch 的监听接口,当配置中心的 JSON 内容发生变化时,触发事件回调,自动重新解析并应用新配置。

config.Watch("app.json", func(newCfg *Config) {
    atomic.StorePointer(¤tConfig, unsafe.Pointer(newCfg))
})
上述代码注册了一个针对 app.json 的监听器,每次配置变更后,通过原子操作更新运行时配置指针,确保读写安全。
数据同步机制
  • 客户端定期轮询配置版本号
  • 仅当检测到版本变化时拉取完整内容
  • 使用 ETag 减少网络传输开销

4.4 多环境日志安全控制与敏感信息过滤

在多环境部署中,日志常包含数据库密码、用户身份令牌等敏感数据。若未加过滤直接输出,极易导致信息泄露。因此,需在日志写入前实施统一的敏感信息拦截机制。
敏感字段自动过滤
通过正则匹配和关键字识别,自动脱敏常见敏感项:
var sensitivePatterns = map[string]*regexp.Regexp{
    "password": regexp.MustCompile(`(?i)password["']?\s*:\s*["'][^"']*["']`),
    "token":    regexp.MustCompile(`(?i)token["']?\s*:\s*["'][^"']*["']`),
    "credit":   regexp.MustCompile(`\b\d{13,16}\b`),
}

func FilterLogMessage(msg string) string {
    for _, pattern := range sensitivePatterns {
        msg = pattern.ReplaceAllString(msg, "***REDACTED***")
    }
    return msg
}
该函数在日志写入前调用,匹配常见敏感字段并替换为占位符。正则表达式忽略大小写,确保覆盖各类变体。
多环境策略隔离
不同环境启用差异化日志策略:
环境日志级别敏感信息处理
开发DEBUG部分脱敏
生产WARN全量脱敏 + 加密传输

第五章:未来趋势与高效日志管理最佳实践总结

智能化日志分析的兴起
现代系统生成的日志量呈指数级增长,传统人工排查已不可行。越来越多企业采用基于机器学习的日志异常检测工具,如 Elastic ML 或 AWS DevOps Guru,自动识别流量突增、错误率飙升等异常模式。某电商平台通过部署Elasticsearch + Machine Learning Job,成功在凌晨0点大促开始前15分钟预警API响应延迟异常,避免了潜在服务雪崩。
统一日志格式提升可维护性
采用结构化日志(如JSON)已成为行业标准。以下Go语言示例展示了如何使用log/slog输出结构化日志:

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("user login attempted", 
    "user_id", 12345,
    "ip", "192.168.1.100",
    "success", false)
该格式便于Logstash解析并写入Elasticsearch,显著提升检索效率。
集中式日志平台的最佳架构
大型分布式系统推荐使用如下日志收集链路:
  • 应用层:输出JSON格式日志到本地文件或stdout
  • 采集层:Filebeat或Fluent Bit轻量级Agent收集并加密传输
  • 处理层:Kafka缓冲高吞吐日志流,Logstash过滤敏感字段
  • 存储与展示:Loki或Elasticsearch存储,Grafana统一可视化
组件适用场景优势
Elasticsearch全文检索需求强强大查询DSL
Loki成本敏感型项目按标签索引,存储开销低80%
安全与合规性保障
GDPR和等保要求日志中不得明文存储用户身份证、手机号。建议在采集阶段即通过正则替换脱敏:

// Logstash filter 示例
mutate {
  gsub => [
    "message", "\d{11}", "****-****-****"
  ]
}
常见日志库NLog、log4net、Serilog和Microsoft.Extensions.Logging介绍和区别 在C#中,日志库的选择主要取决于项目的具体需求,包括性能、易用性、可扩展性等因素。以下是关于NLog、log4net、Serilog和Microsoft.Extensions.Logging的基本介绍和使用示例。 阅读详情

相关推荐

Microsoft.Extensions.Logging.ILogger实现按类名写入不同的日志文件

使用Microsoft.Extensions.Logging框架可以很方便地实现按类名写入不同的日志文件。你可以通过配置LoggerProvider来实现此功能。每个类都将根据其类名创建一个独立的日志文件。请确保设置正确的日志文件夹路径,并根据需要修改文件名格式和日志级别。

weixin_48449171的博客 1897

.NET 6 (C#) Microsoft.Extensions.Logging 日志框架的使用

NET 6 中的日志框架主要是基于 Microsoft.Extensions.Logging,这是一个通用的、可扩展的日志记录接口,允许使用不同的日志提供程序(例如控制台、文件、第三方库等)进行日志记录。本文主要介绍 .NET 6 (C#) 中 Microsoft.Extensions.Logging 日志框架的使用,以及相关的示例代码。

weixin_42098295的博客 1999

C# Microsoft.Extensions.Logging不使用自动注入实例化

C# Microsoft.Extensions.Logging不使用自动注入实例化

L_CSyLYH的博客 1615

c# 日志

Microsoft.Extensions.Logging(这个是日志的基础包)

qq_24769781的博客 366

C#云原生应用中的日志聚合与分析:从入门到精通

在现代软件开发中,尤其是云原生环境中,日志不仅用于故障排查,更是监控、安全审计和业务洞察的关键来源。本文将深入探讨如何使用C#为云原生应用构建高效的日志系统,包括日志聚合、存储、查询及可视化等方面,并提供详尽的代码示例。

墨夶的博客 644

.NET Microsoft.Extensions.Logging + NLog 记录日志到文件

.NET Microsoft.Extensions.Logging + NLog 记录日志到文件

LeoForBest的博客 4273

Huanent.Logging:microsoft.extensions.logging日志组件拓展

Microsoft.Extensions.Logging 日志组件拓展 文件文本日志 文件文本日志UI插件 自定义介质日志 Microsoft.Extensions.Logging.File文件文本日志 安装配置完插件后,你的asp.net core程序会将输出的日志保存在程序根目录下的logs文件夹,并以日期划分文件名 配置 安装Huanent.Logging.File nuget包 在Program.cs文件中添加 public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() 手动高亮 --> .ConfigureLogging(builder => build

如何高效自动化管理多个Steam账号:ArchiSteamFarm完整实战指南

**ArchiSteamFarm**(简称ASF)是一款强大的C#开源工具,专为Steam多账号管理而设计,能够自动收集游戏卡片、管理库存和执行各种自动化任务。在Steam游戏社区中,许多玩家拥有多个账号用于交易、卡片收集或游戏测试,手动管理这些账号既耗时又容易出错。ArchiSteamFarm通过创新的自动化解决方案,让用户可以轻松管理无限数量的Steam账号,无需安装Steam客户端即可实现7

gitblog_00358的博客 403

filelogger:Microsoft.Extensions.Logging框架的轻量级但功能丰富的文件记录器实现

:megaphone: 重要告示 *如果要从2.x升级到3.x,则需要注意一些重大更改。 有关详细信息,请参见的。 *提供了先前主要版本(2.x)的文档。 Karambolo.Extensions.Logging.File 此类库包含接口的轻量级实现,用于文件记录。 在实现.NET Standard 2.0+的所有.NET平台上运行,包括.NET Core 2(ASP.NET Core 2.1 +)、. NET Core 3(ASP.NET Core 3.0+)和.NET5。(需要Microsoft.Extensions。记录2.1及更高版本,因此不支持ASP.NET Core 2.0!) 该代码基于实现了全部功能集的 (包括日志作用域和配置重载)。 该库没有第三方依赖。 由于在后台完成日志消息的处理,因此不会发生I / O阻塞。 文件系统访问是在抽象的基础上实现的,因此甚至可以使用自定义后备存储。 附加

扩增子分析|溯源分析在R中的复现:跟着Nature系列文章利用FEAST溯源分析包追溯微生物群落的起源

溯源分析由Liat Shenhav等人在2019年发表在Nature Methods杂志,他们开创的一种分析微生物群落组成结构的方法,通过量化不同微生物样本(来源)在目标微生物群落(汇)中的比例或分数识别微生物群落的潜在来源。该方法自发表以来受到微生物学界广泛关注,该论文截止2024年10月9日已经被引289次,是领域内高被引论文,该方法已经成为Nature,cell系列文章高度关注的方法。

weixin_46814750的博客 3434

<C#>在 C# .NET 中,使用 LoggerExtensions方法创建日志

为ILogger接口提供了丰富的扩展方法,使你能够方便地记录不同级别的日志信息。通过参数化日志,还能让日志信息更加清晰和易于维护。在实际开发中,合理使用日志记录有助于调试和监控系统的运行状态。

tiger4681的专栏 835

linux中的sendmail发送邮件

linux下的sendmail发送邮件

无痕的博客 6424

c# 日志配置

本文介绍了.NET平台下四种主流日志方案:1)内置的Microsoft.Extensions.Logging,支持控制台、文件等输出;2)NLog,功能丰富支持多种存储;3)log4net,经典灵活;4)Serilog,支持结构化日志。详细说明各方案的基本配置方法、核心API和ASP.NET Core集成方式,并提供了XML/JSON配置示例。文章最后总结日志最佳实践,包括分级策略、异步写入、敏感信息处理等建议,推荐开发和生产环境采用不同的日志级别和输出策略,强调结构化日志在微服务架构中的优势。

onlymscn的博客 555

电力电子论文(TPE、TTE)投稿经验分享

电力电子顶刊论文投稿经验

橙子的博客 2万+

DSMA时序修复避坑指南:当Setup和Hold互卡时,除了调Margin还能做什么?

本文深入探讨DSMA时序修复中的Setup与Hold互锁问题,提供7种高阶策略,包括优先级判断、高级参数组合、单元类型智能替换等,帮助工程师突破时序收敛瓶颈。特别针对fix_eco_timing命令的隐藏参数和物理协同优化进行详细解析,助力芯片设计实现时序收敛。

weixin_30162121的博客 296

微软日志工厂 Microsoft.Extensions.Logging 中增加 log4net 的日志输出

前提:   需要nuget Microsoft.Extensions.Logging.Log4Net.AspNetCore 2.2.6; 描述:解决 .net core微软日志工厂 Microsoft.Extensions.Logging 增加 log4net的日志输出,暂时分为 info,Error,Debug三种类型,按天记录; 实际效果: ....

weixin_30321709的博客 2806

双像素传感器的AI计算摄影实战:单目深度估计与图像去模糊的融合创新

本文介绍了双像素传感器技术在计算机视觉中的应用,包括深度估计、图像去模糊和图像重建等任务。双像素传感器通过两个子单元捕捉视差信息,使摄像头能够分析场景的三维结构和运动轨迹。文章以图像去模糊为例,详细展示了从数据准备到模型训练的完整流程,包括构建自定义数据集、设计双像素特征提取模块、训练去模糊模型及推理测试。通过模拟双像素的"双视角"信息融合,该AI算法能有效恢复模糊图像的清晰细节。

know_F0727的博客 256

Microsoft.Extensions.Logging日志级别从低到高排序顺序

Trace < Debug < Information < Warning < Error < Critical

林子的博客 1371

【Matlab】matlab代码实现sph溃坝模拟

本文介绍了一个基于MATLAB的SPH溃坝模拟实现。代码使用平滑粒子流体动力学方法,通过建立1000个随机分布的粒子,计算粒子间的相互作用力来模拟流体运动。模拟过程包括初始化参数、粒子创建、密度压力更新、速度位置计算以及可视化展示。核心算法采用poly6Kernel和spikyKernelGradient函数处理粒子间作用力。该示例为二维简化模型,仅包含基本物理参数和计算流程,实际应用需进一步优化扩展。

unber的博客 207

Ardupilot EKF3核心算法《开篇》

Ardupilot EKF3核心算法本专栏重点,透彻,详细的分析了ardupilot的EKF3,保证是你看到的最完美的EKF3资料,相信你的选择不会错误。网上EKF资料真是太多,说真的没有一篇讲解好的。!!

陌城烟雨 1413

项目框架构建之5:日志的构建

本文是“”系列之5,本文介绍日志的构建。为了做出通用的公共日志模块,我们需要使用微软的Microsoft.Extensions.Logging日志管理模块,该模块提供了灵活且可扩展的日志记录机制,它为整个.net应用程序提供了一致统一的接口,而且不受具体日志库的限制。通过使用这个库,,它可以集成你想要的任何常见库,如NLog、log4net等。: ILogger 是核心接口,用于在应用程序中进行日志记录。应用程序代码应该通过 ILogger 进行日志记录,而不是直接依赖于具体的日志库。

C#开发 1316

本地Pycharm连接远程服务器详细配置过程(直接在本地使用服务器显卡,很棒)

相信很多人都遇见过这种情况:实验室成员使用同一台服务器,每个人拥有自己的独立账号,我们可以使用服务器更好的配置完成实验,毕竟自己哪有money拥有自己的3090呢。

NorthSmile的博客 4万+

C#中实现日志记录输出

相信很多小伙伴一遇见日志输出就会头疼,其实它也没那么难的。 很多人会选择日志输出的第三方插件使用,可是往往会发现它并没预料的那么简单。 其实不管用什么样的方式来实现它,你只要明白一点,日志输出你就可以理解为简单的文件写入,它实质上就是把你程序运行的过程信息记录到一个日志文件里,方便我们的查看,从而易于找到问题。 下面就是我自己实现的一个简单的日志输出: using System; usin

小志勇的博客 5493

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

no host下的Microsoft.Extensions.Logging使用

no host下的Microsoft.Extensions.Logging使用 用法如下,需要注意的是在非host情况下使用创建loggerFactory时必须要使用using语句。logger.log***是非阻塞语句,不使用using可能会导致程序在logger输出完成前退出,从而导致logger内容不全。 class Program{ static void main(string[] args){ using (var loggerFactory = LoggerFactor

thick__fog的博客 2098

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: C#跨平台性能对比(.NET 6 vs .NET 8 vs Mono)谁才是真王者?
下一篇: 为什么90%的PHP项目微服务化失败?服务注册是关键瓶颈!
LiteCode
博客等级 码龄1年 146粉丝 2019原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值