Commit f9087de0 authored by 席世权's avatar 席世权

添加日志

parent 8878ab09
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{42144D88-4A3C-407A-9CAC-70907E482821}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ApiLog.Act</RootNamespace>
<AssemblyName>ApiLog.Act</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="MongoDB.Bson, Version=2.2.4.26, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MongoDB.Bson.2.2.4\lib\net45\MongoDB.Bson.dll</HintPath>
</Reference>
<Reference Include="MongoDB.Driver, Version=2.2.4.26, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MongoDB.Driver.2.2.4\lib\net45\MongoDB.Driver.dll</HintPath>
</Reference>
<Reference Include="MongoDB.Driver.Core, Version=2.2.4.26, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MongoDB.Driver.Core.2.2.4\lib\net45\MongoDB.Driver.Core.dll</HintPath>
</Reference>
<Reference Include="MongoDB.Driver.Legacy, Version=2.2.4.26, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\mongocsharpdriver.2.2.4\lib\net45\MongoDB.Driver.Legacy.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Http">
<HintPath>..\..\..\develop\负责项目\许Boss\new_edc\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="DAL\MongoLogRepository.cs" />
<Compile Include="DAL\Mongo\APILogsMongRepository.cs" />
<Compile Include="DAL\Mongo\APIWebLogsMongRepository.cs" />
<Compile Include="Filters\RequestLogAttribute.cs" />
<Compile Include="Filters\ResponseLogAttribute.cs" />
<Compile Include="Models\LogModel\Entity\BaseEntity.cs" />
<Compile Include="Models\LogModel\Entity\KafkaLog.cs" />
<Compile Include="Models\LogModel\Model\AddRequestLogModel.cs" />
<Compile Include="Models\LogModel\Param\AddRequestLogParam.cs" />
<Compile Include="Models\LogModel\Param\AddResponseLogParam.cs" />
<Compile Include="Models\Mongo\PushAPILogs.cs" />
<Compile Include="Models\Mongo\APIWebLogs.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Tools\APILogConfig.cs" />
<Compile Include="Tools\IdHelp.cs" />
<Compile Include="Tools\KafkaConfig.cs" />
<Compile Include="Tools\SysUtil.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="BLL\" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\PushPlatform.Common\PushPlatform.Common.csproj">
<Project>{3bcad396-cae2-4c69-83dc-67e955433678}</Project>
<Name>PushPlatform.Common</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using ApiLog.Act.Models.Log;
using ApiLog.Act.Models.Mongo;
using MongoDB.Driver;
using PushPlatform.Common.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ApiLog.Act.DAL.Mongo
{
public class APILogsMongRepository
{
private MongoLogRepository mongoRep = new MongoLogRepository();
/// <summary>
/// 集合名称
/// </summary>
private static readonly string _CollectionName = "PushAPILogs";
#region 新增请求日志
/// <summary>
/// 新增请求日志
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public async Task<AddRequestLogModel> AddRequestLogAsync(AddRequestLogParam param)
{
PushAPILogs entity = new PushAPILogs();
ObjectUtil.CopyPropertys(param, entity);
entity.ID = param.TraceID;
entity.RequestTime = DateTime.Now;
mongoRep.Add<PushAPILogs>(entity);
return new AddRequestLogModel() { RequestTime = entity.RequestTime, TraceID = param.TraceID };
}
#endregion
#region 新增响应日志
/// <summary>
/// 新增响应日志
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public void AddResponseLog(AddResponseLogParam param)
{
var builder = Builders<PushAPILogs>.Filter;
var filter = builder.Eq(nameof(PushAPILogs.ID), param.ParentTraceID);
var update = Builders<PushAPILogs>.Update
.Set(nameof(PushAPILogs.ResponseBody), param.ResponseBody)
.Set(nameof(PushAPILogs.ResponseTime), DateTime.Now)
.Set(nameof(PushAPILogs.TimeCost), param.TimeCost);
if (param.IsError)
{
update = update.Set(nameof(PushAPILogs.IsError), param.IsError)
.Set(nameof(PushAPILogs.ErrorBody), param.ErrorBody)
.Set(nameof(PushAPILogs.ErrorBody), param.ErrorBody);
}
mongoRep.Update(_CollectionName.ToLower(),filter, update);
}
#endregion
}
}
using ApiLog.Act.Models.Log;
using ApiLog.Act.Models.Mongo;
using MongoDB.Driver;
using PushPlatform.Common.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace ApiLog.Act.DAL.Mongo
{
public class APIWebLogsMongRepository
{
private MongoLogRepository mongoRep = new MongoLogRepository();
//private MongoRepository mongoRep = new MongoRepository();
/// <summary>
/// 集合名称
/// </summary>
private static readonly string _CollectionName = "APIWebLogs";
#region 新增请求日志
/// <summary>
/// 新增请求日志
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public async Task<AddRequestLogModel> AddRequestLogAsync(AddRequestLogParam param)
{
APIWebLogs entity = new APIWebLogs();
ObjectUtil.CopyPropertys(param, entity);
entity.ID = param.TraceID;
entity.RequestTime = DateTime.Now;
mongoRep.Add<APIWebLogs>(entity);
return new AddRequestLogModel() { RequestTime = entity.RequestTime, TraceID = param.TraceID };
}
#endregion
#region 新增响应日志
/// <summary>
/// 新增响应日志
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public void AddResponseLog(AddResponseLogParam param)
{
var builder = Builders<APIWebLogs>.Filter;
var filter = builder.Eq(nameof(APIWebLogs.ID), param.ParentTraceID);
var update = Builders<APIWebLogs>.Update
.Set(nameof(APIWebLogs.ResponseBody), param.ResponseBody)
.Set(nameof(APIWebLogs.ResponseTime), DateTime.Now)
.Set(nameof(APIWebLogs.TimeCost), param.TimeCost);
if (param.IsError)
{
update = update.Set(nameof(APIWebLogs.IsError), param.IsError)
.Set(nameof(APIWebLogs.ErrorBody), param.ErrorBody)
.Set(nameof(APIWebLogs.ErrorBody), param.ErrorBody);
}
mongoRep.Update(_CollectionName.ToLower(),filter, update);
}
/// <summary>
/// 查询日志信息
/// </summary>
/// <param name="aPIWebLogs"></param>
/// <returns></returns>
public async Task<SearchLogsPaggingAsyncOutput> SearchLogsPaggingAsync(SearchAPIWebLogs aPIWebLogs)
{
SearchLogsPaggingAsyncOutput searchLogsPaggingAsyncOutput = new SearchLogsPaggingAsyncOutput();
Expression<Func<APIWebLogs, bool>> expre = x => x.RequestTime > aPIWebLogs.BeginDate && x.RequestTime < aPIWebLogs.EndDate&&x.IsError==aPIWebLogs.IsError;
Expression<Func<APIWebLogs, object>> sort = x => x.RequestTime;
if (aPIWebLogs.APIName != null && aPIWebLogs.APIName != "") {
expre = x => x.APIName == aPIWebLogs.APIName && x.RequestTime > aPIWebLogs.BeginDate && x.RequestTime < aPIWebLogs.EndDate && x.IsError == aPIWebLogs.IsError;
}
var result=await mongoRep.PagingQueryAndOrderWithoutBaseEntity<APIWebLogs>(expre, sort, aPIWebLogs.pageIndex, aPIWebLogs.PageSize,true);
var count= mongoRep.GetCountWithoutBaseEntity<APIWebLogs>(expre);
searchLogsPaggingAsyncOutput.aPIWebLogs = result;
searchLogsPaggingAsyncOutput.Count = (int)count;
return searchLogsPaggingAsyncOutput;
}
#endregion
}
}
This diff is collapsed.
using ApiLog.Act.DAL.Mongo;
using ApiLog.Act.Models.Log;
using ApiLog.Act.Tools;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace ApiLog.Act.Filters
{
/// <summary>
/// 进入数据日志处理-过滤器
/// </summary>
public class RequestLogAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
#region 初始化
/// <summary>
/// 接口日志服务
/// </summary>
private static APILogsMongRepository apiLogDal = new APILogsMongRepository();
#endregion
/// <summary>
/// 进入处理
/// </summary>
/// <param name="actionContext"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public override async Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
#region 获取传入的数据
var jsonData = "";
try
{
if (System.Web.HttpContext.Current.Request.ContentType != null && System.Web.HttpContext.Current.Request.ContentType != "")
{
var contentType = System.Web.HttpContext.Current.Request.ContentType.ToLower();
if ((contentType.Contains("application/x-www-form-urlencoded")
|| contentType.Contains("multipart/form-data"))
&& System.Web.HttpContext.Current.Request.ContentLength > 0)
{
var bodyinfo = new Dictionary<string, string>();
foreach (string key in System.Web.HttpContext.Current.Request.Form)
{
bodyinfo.Add(key, System.Web.HttpContext.Current.Request.Form.GetValues(key)[0]);
}
jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(bodyinfo);
}
else if (contentType.Contains("application/json"))
{
if (actionContext.ActionArguments.Count > 1)
jsonData = "[";
foreach (var item in actionContext.ActionArguments)
{
if (actionContext.ActionArguments.Count > 1)
jsonData += Newtonsoft.Json.JsonConvert.SerializeObject(item.Value) + ",";
else
jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(item.Value);
continue;
}
if (actionContext.ActionArguments.Count > 1)
jsonData = jsonData.Substring(0, (jsonData.Length - 1)) + "]";
}
if (System.Web.HttpContext.Current.Request.Path.ToLower().IndexOf("ocr_result") > -1)
{
long big = Encoding.Default.GetByteCount(jsonData);
if (big > 40720)
jsonData = "";
}
}
#endregion
#region 新增接口日志
//获取全局日志追踪ID
var globalLogTraceID = string.Empty;
if (System.Web.HttpContext.Current.Request.Headers.GetValues(nameof(APILogConfig.PoJun_GlobalLogTraceID)) != null)
globalLogTraceID = System.Web.HttpContext.Current.Request.Headers.GetValues(nameof(APILogConfig.PoJun_GlobalLogTraceID)).FirstOrDefault();
//获取全局日志级别
int globalLogLevel = 0;
if (System.Web.HttpContext.Current.Request.Headers.GetValues(nameof(APILogConfig.PoJun_GlobalLogLevel)) != null)
globalLogLevel = Convert.ToInt32(System.Web.HttpContext.Current.Request.Headers.GetValues(nameof(APILogConfig.PoJun_GlobalLogLevel)).FirstOrDefault());
else
globalLogLevel++;
//获取日志ID
var logTraceID = IdHelp.GetGuidBy32();
var requestTime = DateTime.Now;
var logParam = new AddRequestLogParam();
logParam.APIName = System.Web.HttpContext.Current.Request.Path;
//这里存储的是客户端的IP+端口
logParam.ClientHost = $"{System.Web.HttpContext.Current.Request.UserHostAddress}";
var result = new Dictionary<string, string>();
var headers = System.Web.HttpContext.Current.Request.Headers;
foreach (string key in headers.Keys)
{
result.Add(key, headers.GetValues(key)[0]);
}
logParam.Headers = Newtonsoft.Json.JsonConvert.SerializeObject(result);
//logParam.Headers = Newtonsoft.Json.JsonConvert.SerializeObject(System.Web.HttpContext.Current.Request.Headers);
logParam.Level = globalLogLevel;
if (logParam.APIName.ToLower().IndexOf("uploadfile") > -1) //如果上传文件流就清空
jsonData = "";
logParam.RequestBody = jsonData;
//这里存储的当前服务器的IP+端口+接口地址+url参数
logParam.ServerHost = $"{System.Web.HttpContext.Current.Request.Url.AbsoluteUri}";
logParam.SystemID = SysUtil.GetSystemId();
logParam.TraceID = logTraceID;
//如果全局日志追踪ID为空则使用本次日志追踪ID为全局日志追踪ID
logParam.GlobalTraceID = string.IsNullOrEmpty(globalLogTraceID) ? logTraceID : globalLogTraceID;
logParam.ParentTraceID = globalLogTraceID;
logParam.RequestTime = requestTime;
//新增日志
await apiLogDal.AddRequestLogAsync(logParam);
if (KafkaConfig.GetInstance().IsEnable)
{
////开启异步新线程把日志信息推送到kafka
//Task task = new Task(async () =>
//{
// var kafkaLog = new KafkaLog();
// kafkaLog.Body = Newtonsoft.Json.JsonConvert.SerializeObject(logParam);
// kafkaLog.Type = 1;
// await kafkaProducer.SendAsync(KafkaConfig.GetInstance().BrokerUrl, KafkaConfig.GetInstance().Topic, Newtonsoft.Json.JsonConvert.SerializeObject(kafkaLog));
//});
//task.Start();//执行
}
#endregion
#region 向后传输数据
//把日志ID写入
System.Web.HttpContext.Current.Request.Headers.Add(nameof(APILogConfig.PoJun_LogTraceID), logTraceID);
//把接口请求时间写入
System.Web.HttpContext.Current.Request.Headers.Add(nameof(APILogConfig.RequestTime), requestTime.ToString("yyyy-MM-dd HH:mm:ss.fff"));
//把全局日志级别写入
System.Web.HttpContext.Current.Request.Headers.Remove(nameof(APILogConfig.PoJun_GlobalLogLevel));
System.Web.HttpContext.Current.Request.Headers.Add(nameof(APILogConfig.PoJun_GlobalLogLevel), globalLogLevel.ToString());
//如果全局日志追踪ID为空则使用本次日志追踪ID为全局日志追踪ID
if (string.IsNullOrEmpty(globalLogTraceID))
{
System.Web.HttpContext.Current.Request.Headers.Add(nameof(APILogConfig.PoJun_GlobalLogTraceID), logTraceID);
}
#endregion
await base.OnActionExecutingAsync(actionContext, cancellationToken);
}
catch (Exception ex)
{
jsonData = $"参数获取失败报错!StackTrace:{ex.StackTrace} | Message:{ex.Message} | Source:{ex.Source}";
}
}
}
}
using ApiLog.Act.DAL.Mongo;
using ApiLog.Act.Models.Log;
using ApiLog.Act.Tools;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http.Filters;
namespace ApiLog.Act.Filters
{
/// <summary>
/// 返回数据日志处理
/// </summary>
public class ResponseLogAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
#region 初始化
/// <summary>
/// 接口日志服务
/// </summary>
private static APILogsMongRepository apiLogDal = new APILogsMongRepository();
#endregion
/// <summary>
/// 新增返回日志
/// </summary>
/// <param name="actionExecutedContext"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public override async Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{
#region 新增接口返回日志
var logTraceID = System.Web.HttpContext.Current.Request.Headers.Get(nameof(APILogConfig.PoJun_LogTraceID));
if (logTraceID != null)
{
var _requestTime = Convert.ToDateTime(System.Web.HttpContext.Current.Request.Headers.Get(nameof(APILogConfig.RequestTime)));
var logParam = new AddResponseLogParam();
logParam.IsError = false;
if (actionExecutedContext.Response != null && System.Web.HttpContext.Current.Request.Path.ToLower().IndexOf("upload/showfile") <0)
{
try
{
logParam.ResponseBody = await actionExecutedContext.Response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
logParam.ResponseBody = $"参数获取失败报错!StackTrace:{ex.StackTrace} | Message:{ex.Message} | Source:{ex.Source}";
}
}
else
{
if (actionExecutedContext.Exception != null)
{
logParam.ErrorBody = $"StackTrace:{actionExecutedContext.Exception.StackTrace} | Message:{actionExecutedContext.Exception.Message} | Source:{actionExecutedContext.Exception.Source}";
logParam.IsError = true;
}
}
var _globalTraceID = System.Web.HttpContext.Current.Request.Headers.Get(nameof(APILogConfig.PoJun_GlobalLogTraceID));
logParam.GlobalTraceID = _globalTraceID;
logParam.ParentTraceID = logTraceID.ToString();
logParam.ResponseTime = DateTime.Now;
logParam.TimeCost = Convert.ToInt32((logParam.ResponseTime - Convert.ToDateTime(_requestTime)).TotalMilliseconds);
await Task.Run(() =>
{
apiLogDal.AddResponseLog(logParam);
});
}
#endregion
await base.OnActionExecutedAsync(actionExecutedContext, cancellationToken);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Bson;
namespace ApiLog.Act.Models.Log.Entity
{
/// <summary>
/// 基类
/// </summary>
public class BaseEntity
{
/// <summary>
/// mongoDB 主键
/// </summary>
[BsonId]
public string _id { get; set; }
/// <summary>
/// 创建人
/// </summary>
public string CreateUser { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[BsonDateTimeOptions(Kind = DateTimeKind.Local, Representation = BsonType.DateTime)]
public DateTime CreateTime { get; set; }
/// <summary>
/// 是否删除
/// </summary>
public bool IsDeleted { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public long Timestamp { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace ApiLog.Act.Models.Log
{
/// <summary>
/// Kafka日志
/// </summary>
public class KafkaLog
{
/// <summary>
/// kafka日志内容 1:代表请求 2:代表返回结果
/// </summary>
public int Type { get; set; }
/// <summary>
/// 日志内容
/// </summary>
public string Body { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace ApiLog.Act.Models.Log
{
/// <summary>
/// 【新增请求日志】返回结果
/// </summary>
public class AddRequestLogModel
{
/// <summary>
/// 追踪ID【请求进入时生成的日志ID】
/// </summary>
public string TraceID { get; set; }
/// <summary>
/// 请求时间
/// </summary>
public DateTime RequestTime { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace ApiLog.Act.Models.Log
{
/// <summary>
/// 【新增请求日志】参数
/// </summary>
public class AddRequestLogParam
{
/// <summary>
/// 追踪ID【请求进入时生成的日志ID】[自动设置不需要赋值]
/// </summary>
public string TraceID { get; set; }
/// <summary>
/// 全局唯一追踪ID[自动设置不需要赋值]
/// </summary>
public string GlobalTraceID { get; set; }
/// <summary>
/// 父追踪ID[自动设置不需要赋值]
/// </summary>
public string ParentTraceID { get; set; }
/// <summary>
/// 系统ID[自动设置不需要赋值]
/// </summary>
public string SystemID { get; set; }
/// <summary>
/// 接口名称
/// </summary>
public string APIName { get; set; }
/// <summary>
/// 客户端的域名或IP[自动设置不需要赋值]
/// </summary>
public string ClientHost { get; set; }
/// <summary>
/// 服务器的域名或IP
/// </summary>
public string ServerHost { get; set; }
/// <summary>
/// 等级ID(从1开始)[自动设置不需要赋值]
/// </summary>
public int Level { get; set; }
/// <summary>
/// 请求内容
/// </summary>
public string RequestBody { get; set; }
/// <summary>
/// 请求时间
/// </summary>
public DateTime RequestTime { get; set; }
/// <summary>
/// 请求头
/// </summary>
public string Headers { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace ApiLog.Act.Models.Log
{
/// <summary>
/// 【新增响应日志】参数
/// </summary>
public class AddResponseLogParam
{
/// <summary>
/// 全局唯一追踪ID[自动设置不需要赋值]
/// </summary>
public string GlobalTraceID { get; set; }
/// <summary>
/// 父追踪ID[自动设置不需要赋值]
/// </summary>
public string ParentTraceID { get; set; }
/// <summary>
/// 响应时间
/// </summary>
public DateTime ResponseTime { get; set; }
/// <summary>
/// 响应内容
/// </summary>
public string ResponseBody { get; set; }
/// <summary>
/// 错误内容
/// </summary>
public string ErrorBody { get; set; }
/// <summary>
/// 请求耗时(毫秒)
/// </summary>
public int TimeCost { get; set; }
/// <summary>
/// 是否为报错日志
/// </summary>
public bool IsError { get; set; } = false;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ApiLog.Act.Models.Mongo
{
public class APIWebLogs:PushAPILogs
{
}
public class SearchAPIWebLogs : PushAPILogs
{
/// <summary>
/// 查询开始时间
/// </summary>
public DateTime BeginDate { get; set; }
/// <summary>
/// 查询结束时间
/// </summary>
public DateTime EndDate { get; set; }
/// <summary>
/// 页数
/// </summary>
public int pageIndex { get; set; } = 1;
/// <summary>
/// 每页数量
/// </summary>
public int PageSize { get; set; }
}
public class SearchLogsPaggingAsyncOutput
{
public int Count { get; set; }
public List<APIWebLogs> aPIWebLogs { get; set; }
}
}
using MongoDB.Bson.Serialization.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ApiLog.Act.Models.Mongo
{
/// <summary>
/// 接口日志
/// </summary>
[BsonIgnoreExtraElements]
public class PushAPILogs
{
#region 初始化
/// <summary>
/// 父追踪ID(简写)
/// </summary>
public const string PTID = "PTID";
#endregion
/// <summary>
/// 日志追踪ID
/// </summary>
[BsonId]
public string ID { get; set; }
/// <summary>
/// 全局唯一追踪ID
/// </summary>
public string GlobalTraceID { get; set; }
/// <summary>
/// 父追踪ID
/// </summary>
[BsonElement(PushAPILogs.PTID)]
public string ParentTraceID { get; set; }
/// <summary>
/// 系统ID
/// </summary>
public string SystemID { get; set; }
/// <summary>
/// 接口名称
/// </summary>
public string APIName { get; set; }
/// <summary>
/// 客户端的域名或IP
/// </summary>
public string ClientHost { get; set; }
/// <summary>
/// 服务器的域名或IP
/// </summary>
public string ServerHost { get; set; }
/// <summary>
/// 等级ID(从1开始)
/// </summary>
public int Level { get; set; }
/// <summary>
/// 请求时间
/// </summary>
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime RequestTime { get; set; }
/// <summary>
/// [响应/错误]时间
/// </summary>
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime ResponseTime { get; set; }
/// <summary>
/// 请求耗时(毫秒)
/// </summary>
public int TimeCost { get; set; }
/// <summary>
/// 请求内容
/// </summary>
public string RequestBody { get; set; }
/// <summary>
/// 响应内容
/// </summary>
public string ResponseBody { get; set; }
/// <summary>
/// 错误内容
/// </summary>
public string ErrorBody { get; set; }
/// <summary>
/// 请求头
/// </summary>
public string Headers { get; set; }
/// <summary>
/// 是否为报错日志
/// </summary>
public bool IsError { get; set; } = false;
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("ApiLog.Act")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ApiLog.Act")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("42144d88-4a3c-407a-9cac-70907e482821")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
using System;
using System.Collections.Generic;
using System.Text;
namespace ApiLog.Act.Tools
{
/// <summary>
/// 接口日志配置
/// </summary>
public class APILogConfig
{
/// <summary>
/// 传入数据
/// </summary>
public static readonly string PoJun_JsonData = string.Empty;
/// <summary>
/// 日志追踪ID(第一次新增日志的主键ID)【单系统专用】
/// </summary>
public static readonly string PoJun_LogTraceID = string.Empty;
/// <summary>
/// 全局日志追踪ID(日志调用链专用)
/// </summary>
public static readonly string PoJun_GlobalLogTraceID = string.Empty;
/// <summary>
/// 全局日志级别
/// </summary>
public static readonly string PoJun_GlobalLogLevel = string.Empty;
/// <summary>
/// 接口请求时间
/// </summary>
public static readonly string RequestTime = string.Empty;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ApiLog.Act.Tools
{
public class IdHelp
{
public static string GetGuidBy32()
{
return Guid.NewGuid().ToString().Replace("-", "");
}
}
}
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Text;
namespace ApiLog.Act.Tools
{
/// <summary>
/// kafka配置信息
/// </summary>
public class KafkaConfig
{
#region 初始化
/// <summary>
/// 初始化
/// </summary>
/// <returns></returns>
public static KafkaConfig GetInstance()
{
KafkaConfig kafkaConfig = new KafkaConfig();
kafkaConfig.IsEnable = false;
return kafkaConfig;
}
#endregion
/// <summary>
/// 是否启用kafka
/// </summary>
public bool IsEnable { get; set; }
/// <summary>
/// kafka后台IP+端口
/// </summary>
public string BrokerUrl { get; set; }
/// <summary>
/// topic Name
/// </summary>
public string Topic { get; set; }
/// <summary>
/// group Id
/// </summary>
public string GroupId { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Configuration;
namespace ApiLog.Act.Tools
{
/// <summary>
/// 系统帮助类
/// </summary>
public static class SysUtil
{
#region 日志追踪ID(第一次新增日志的主键ID)【单系统专用】
/// <summary>
/// 日志追踪ID(第一次新增日志的主键ID)【单系统专用】
/// </summary>
/// <returns></returns>
public static string GetTraceId()
{
if (System.Web.HttpContext.Current == null || System.Web.HttpContext.Current.Request == null || System.Web.HttpContext.Current.Request.Headers == null)
return null;
return System.Web.HttpContext.Current.Request.Headers.Get(nameof(APILogConfig.PoJun_LogTraceID));
}
#endregion
#region 全局日志追踪ID(日志调用链专用)
/// <summary>
/// 全局日志追踪ID(日志调用链专用)
/// </summary>
/// <returns></returns>
public static string GlobalTraceId()
{
if (System.Web.HttpContext.Current == null || System.Web.HttpContext.Current.Request == null || System.Web.HttpContext.Current.Request.Headers == null)
return null;
return System.Web.HttpContext.Current.Request.Headers.Get(nameof(APILogConfig.PoJun_GlobalLogTraceID));
}
#endregion
#region 获取系统ID
/// <summary>
/// 获取系统ID
/// </summary>
/// <returns></returns>
public static string GetSystemId()
{
var sysId = ConfigurationManager.AppSettings["SystemID"];
if (sysId == null)
return "";
else
return sysId.ToString();
}
#endregion
}
}
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="mongocsharpdriver" version="2.2.4" targetFramework="net45" />
<package id="MongoDB.Bson" version="2.2.4" targetFramework="net45" />
<package id="MongoDB.Driver" version="2.2.4" targetFramework="net45" />
<package id="MongoDB.Driver.Core" version="2.2.4" targetFramework="net45" />
</packages>
\ No newline at end of file
...@@ -55,9 +55,16 @@ namespace DapperORM.ORMExtention ...@@ -55,9 +55,16 @@ namespace DapperORM.ORMExtention
{ {
//如果还没有加载,则加载该DbProviderFactory //如果还没有加载,则加载该DbProviderFactory
if (!_ProviderFactoies.ContainsKey(providerType)) if (!_ProviderFactoies.ContainsKey(providerType))
{
try
{ {
_ProviderFactoies.Add(providerType, ImportDbProviderFactory(providerType)); _ProviderFactoies.Add(providerType, ImportDbProviderFactory(providerType));
} }
catch (Exception ex)
{
return _ProviderFactoies[providerType];
}
}
return _ProviderFactoies[providerType]; return _ProviderFactoies[providerType];
} }
......
...@@ -34,6 +34,9 @@ namespace PushPf.Api ...@@ -34,6 +34,9 @@ namespace PushPf.Api
{ {
DateTimeFormat = "yyyy-MM-dd HH:mm:ss" DateTimeFormat = "yyyy-MM-dd HH:mm:ss"
}); });
config.Filters.Add(new ApiLog.Act.Filters.RequestLogAttribute());
config.Filters.Add(new ApiLog.Act.Filters.ResponseLogAttribute());
} }
} }
} }
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<AssemblyName>PushPf.Api</AssemblyName> <AssemblyName>PushPf.Api</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion> <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<MvcBuildViews>false</MvcBuildViews> <MvcBuildViews>false</MvcBuildViews>
<UseIISExpress>true</UseIISExpress> <UseIISExpress>false</UseIISExpress>
<IISExpressSSLPort /> <IISExpressSSLPort />
<IISExpressAnonymousAuthentication /> <IISExpressAnonymousAuthentication />
<IISExpressWindowsAuthentication /> <IISExpressWindowsAuthentication />
...@@ -201,6 +201,10 @@ ...@@ -201,6 +201,10 @@
<Content Include="Scripts\_references.js" /> <Content Include="Scripts\_references.js" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\ApiLog.Act\ApiLog.Act.csproj">
<Project>{42144d88-4a3c-407a-9cac-70907e482821}</Project>
<Name>ApiLog.Act</Name>
</ProjectReference>
<ProjectReference Include="..\PushApi.Act\PushApi.Act.csproj"> <ProjectReference Include="..\PushApi.Act\PushApi.Act.csproj">
<Project>{474D1182-7D75-466E-8574-137491176F7F}</Project> <Project>{474D1182-7D75-466E-8574-137491176F7F}</Project>
<Name>PushApi.Act</Name> <Name>PushApi.Act</Name>
...@@ -233,7 +237,7 @@ ...@@ -233,7 +237,7 @@
<AutoAssignPort>True</AutoAssignPort> <AutoAssignPort>True</AutoAssignPort>
<DevelopmentServerPort>61158</DevelopmentServerPort> <DevelopmentServerPort>61158</DevelopmentServerPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath> <DevelopmentServerVPath>/</DevelopmentServerVPath>
<IISUrl>http://localhost:61158/</IISUrl> <IISUrl>http://localhost/PushPf.Api</IISUrl>
<NTLMAuthentication>False</NTLMAuthentication> <NTLMAuthentication>False</NTLMAuthentication>
<UseCustomServer>False</UseCustomServer> <UseCustomServer>False</UseCustomServer>
<CustomServerUrl> <CustomServerUrl>
......
...@@ -5,9 +5,10 @@ ...@@ -5,9 +5,10 @@
--> -->
<configuration> <configuration>
<connectionStrings> <connectionStrings>
<add name="WriteConnStr" connectionString="Server=192.168.0.39;Database=db_ashermed_push;Uid=root;Pwd=root;" /> <add name="WriteConnStr" connectionString="Server=192.168.0.49;Database=db_ashermed_push;Uid=user;Pwd=Asher1234;"/>
<add name="ReadConnStr" connectionString="Server=192.168.0.39;Database=db_ashermed_push;Uid=root;Pwd=root;" /> <add name="ReadConnStr" connectionString="Server=192.168.0.49;Database=db_ashermed_push;Uid=user;Pwd=Asher1234;"/>
<add name="PushPlatformContext" connectionString="Server=192.168.0.49;Database=db_ashermed_push;Uid=user;Pwd=Asher1234;"/>
<add name="mongo_edc_log" connectionString="mongodb://iis_Trialdem:WezpeW1ajDvBGnz@101.132.228.78:3717/ASHermed_91Trialdem_Logs?slaveOk=true" />
<!--<add name="WriteConnStr" connectionString="Server=101.132.234.102;Database=db_ashermed_push;Uid=iis;Pwd=iis;"/> <!--<add name="WriteConnStr" connectionString="Server=101.132.234.102;Database=db_ashermed_push;Uid=iis;Pwd=iis;"/>
<add name="ReadConnStr" connectionString="Server=101.132.234.102;Database=db_ashermed_push;Uid=iis;Pwd=iis;"/>--> <add name="ReadConnStr" connectionString="Server=101.132.234.102;Database=db_ashermed_push;Uid=iis;Pwd=iis;"/>-->
</connectionStrings> </connectionStrings>
...@@ -24,6 +25,9 @@ ...@@ -24,6 +25,9 @@
<add key="webpages:Enabled" value="false" /> <add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" /> <add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="WechatTokenUrl" value="https://tools.ashermed.com/Wechat/Token/"/>
<add key="IsProd" value="0"/>
</appSettings> </appSettings>
<system.web> <system.web>
<compilation debug="true" targetFramework="4.5" /> <compilation debug="true" targetFramework="4.5" />
......
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14 # Visual Studio Version 16
VisualStudioVersion = 14.0.25420.1 VisualStudioVersion = 16.0.31910.168
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PushPlatform.Background", "PushPlatform.Background\PushPlatform.Background.csproj", "{CA9CD20B-A754-466E-B93B-31CD259FD997}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PushPlatform.Background", "PushPlatform.Background\PushPlatform.Background.csproj", "{CA9CD20B-A754-466E-B93B-31CD259FD997}"
EndProject EndProject
...@@ -41,6 +41,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PushApi.Act", "PushApi.Act\ ...@@ -41,6 +41,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PushApi.Act", "PushApi.Act\
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PushTask.exe", "PushTask.exe\PushTask.exe.csproj", "{42E56BCA-D4E4-4EFC-AA7C-4A536EDD35FB}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PushTask.exe", "PushTask.exe\PushTask.exe.csproj", "{42E56BCA-D4E4-4EFC-AA7C-4A536EDD35FB}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiLog.Act", "ApiLog.Act\ApiLog.Act.csproj", "{42144D88-4A3C-407A-9CAC-70907E482821}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
...@@ -107,6 +109,10 @@ Global ...@@ -107,6 +109,10 @@ Global
{42E56BCA-D4E4-4EFC-AA7C-4A536EDD35FB}.Debug|Any CPU.Build.0 = Debug|Any CPU {42E56BCA-D4E4-4EFC-AA7C-4A536EDD35FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{42E56BCA-D4E4-4EFC-AA7C-4A536EDD35FB}.Release|Any CPU.ActiveCfg = Release|Any CPU {42E56BCA-D4E4-4EFC-AA7C-4A536EDD35FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{42E56BCA-D4E4-4EFC-AA7C-4A536EDD35FB}.Release|Any CPU.Build.0 = Release|Any CPU {42E56BCA-D4E4-4EFC-AA7C-4A536EDD35FB}.Release|Any CPU.Build.0 = Release|Any CPU
{42144D88-4A3C-407A-9CAC-70907E482821}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{42144D88-4A3C-407A-9CAC-70907E482821}.Debug|Any CPU.Build.0 = Debug|Any CPU
{42144D88-4A3C-407A-9CAC-70907E482821}.Release|Any CPU.ActiveCfg = Release|Any CPU
{42144D88-4A3C-407A-9CAC-70907E482821}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
...@@ -116,5 +122,9 @@ Global ...@@ -116,5 +122,9 @@ Global
{0B25D618-2334-4810-99F2-6F75345C7A14} = {9C71C7FD-12AB-408D-B4A3-077C22E60D72} {0B25D618-2334-4810-99F2-6F75345C7A14} = {9C71C7FD-12AB-408D-B4A3-077C22E60D72}
{4D340BC0-0D02-4738-AEEE-F31EDF4F604D} = {9C71C7FD-12AB-408D-B4A3-077C22E60D72} {4D340BC0-0D02-4738-AEEE-F31EDF4F604D} = {9C71C7FD-12AB-408D-B4A3-077C22E60D72}
{474D1182-7D75-466E-8574-137491176F7F} = {9C71C7FD-12AB-408D-B4A3-077C22E60D72} {474D1182-7D75-466E-8574-137491176F7F} = {9C71C7FD-12AB-408D-B4A3-077C22E60D72}
{42144D88-4A3C-407A-9CAC-70907E482821} = {9C71C7FD-12AB-408D-B4A3-077C22E60D72}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {98D5ACDD-11D6-43EC-AF25-B7EE06CC5BDD}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment