예제 #1
0
            public override void OnResultExecuted(ResultExecutedContext context)
            {
                var hc = context.HttpContext;

                string controller = context.RouteData.Values["controller"].ToString().ToLower();
                string action     = context.RouteData.Values["action"].ToString().ToLower();
                string url        = hc.Request.Path.ToString() + hc.Request.QueryString.Value;

                try
                {
                    //客户端信息
                    var ct = new Core.ClientTo(hc);

                    //用户信息
                    var userinfo = Func.Common.GetLoginUserInfo(hc);

                    //日志保存
                    var mo = new Domain.SysLog()
                    {
                        LogId          = Guid.NewGuid().ToString(),
                        SuName         = userinfo.UserName,
                        SuNickname     = userinfo.Nickname,
                        LogAction      = controller + "/" + action,
                        LogUrl         = url,
                        LogIp          = ct.IPv4,
                        LogCreateTime  = DateTime.Now,
                        LogBrowserName = ct.BrowserName,
                        LogSystemName  = ct.SystemName,
                        LogGroup       = 1
                    };
                    mo.LogContent = DicDescription[mo.LogAction.ToLower()];

                    using (var db = new Data.ContextBase())
                    {
                        db.SysLog.Add(mo);
                        db.SaveChanges();
                    }
                }
                catch (Exception)
                {
                    //throw new System.Exception("写入操作日志失败");
                }

                base.OnResultExecuted(context);
            }
예제 #2
0
            public override void OnResultExecuted(ResultExecutedContext context)
            {
                var hc = context.HttpContext;

                string controller = context.RouteData.Values["controller"].ToString().ToLower();
                string action     = context.RouteData.Values["action"].ToString().ToLower();
                string url        = hc.Request.Path.ToString() + hc.Request.QueryString.Value;

                try
                {
                    //客户端信息
                    var ct = new Core.ClientTo(hc);

                    //用户信息
                    var userinfo = Func.Common.GetLoginUserInfo(hc);

                    //日志保存
                    var mo = new Domain.SysLog()
                    {
                        ID          = Guid.NewGuid().ToString(),
                        UserName    = userinfo.UserName,
                        Nickname    = userinfo.Nickname,
                        Action      = controller + "/" + action,
                        Url         = url,
                        Ip          = ct.IPv4,
                        CreateTime  = DateTime.Now,
                        BrowserName = ct.BrowserName,
                        SystemName  = ct.SystemName,
                        LogGroup    = 1,

                        LogContent = Func.ProjectDocs.QueryNotes(controller, action, hc)
                    };

                    using (var ru = new Data.RepositoryUse())
                    {
                        ru.SysLogRepository.Insert(mo);
                    }
                }
                catch (Exception)
                {
                    //throw new System.Exception("写入操作日志失败");
                }

                base.OnResultExecuted(context);
            }
예제 #3
0
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                var hc = context.HttpContext;

                //日志记录,设置“__nolog”参数可忽略日志记录,为压力测试等环境考虑(即一些不需要记录请求日志的需求)

                //如果需要记录更详细的日志,可提取请求的参数、表单信息写入日志
                //可能信息量较大,需要考虑分开存储,推荐方案:使用sqlite-net-pcl包按月或按天拆分写入SQLite数据库文件

                if (string.IsNullOrWhiteSpace(hc.Request.Query["__nolog"].ToString()))
                {
                    string controller = context.RouteData.Values["controller"].ToString().ToLower();
                    string action     = context.RouteData.Values["action"].ToString().ToLower();
                    string url        = hc.Request.Path.ToString() + hc.Request.QueryString.Value;

                    try
                    {
                        //客户端信息
                        var ct = new Core.ClientTo(hc);

                        //用户信息
                        var userinfo = Func.Common.GetLoginUserInfo(hc);

                        //日志保存
                        var mo = new Domain.SysLog()
                        {
                            LogId          = Guid.NewGuid().ToString(),
                            SuName         = userinfo.UserName,
                            SuNickname     = userinfo.Nickname,
                            LogAction      = controller + "/" + action,
                            LogUrl         = url,
                            LogIp          = ct.IPv4,
                            LogCreateTime  = DateTime.Now,
                            LogBrowserName = ct.BrowserName,
                            LogSystemName  = ct.SystemName,
                            LogGroup       = 1
                        };

                        try
                        {
                            //IP城市
                            var city = new ipdb.City(GlobalTo.GetValue("logs:ipdb").Replace("~", GlobalTo.ContentRootPath));

                            var ips = mo.LogIp.Split(',');
                            var ipc = string.Empty;
                            foreach (var ip in ips)
                            {
                                var listCity = city.find(ip.Trim().Replace("::1", "127.0.0.1"), "CN").Distinct();
                                ipc += string.Join(",", listCity).TrimEnd(',') + ";";
                            }
                            mo.LogCity = ipc.TrimEnd(';');
                        }
                        catch (Exception)
                        {
                            mo.LogCity = "fail";
                        }

                        mo.LogContent = DicDescription[mo.LogAction.ToLower()];

                        #region 分批写入日志

                        //分批写入满足的条件:缓存的日志数量
                        int cacheLogCount = GlobalTo.GetValue <int>("logs:batchwritecount");
                        //分批写入满足的条件:缓存的时长,单位秒
                        int cacheLogTime = GlobalTo.GetValue <int>("logs:batchwritetime");

                        //日志记录
                        var cacheLogsKey = "Global_Logs";
                        //上次写入的时间
                        var cacheLogWriteKey = "Global_Logs_Write";

                        if (!(Core.CacheTo.Get(cacheLogsKey) is List <Domain.SysLog> cacheLogs))
                        {
                            cacheLogs = new List <Domain.SysLog>();
                        }
                        cacheLogs.Add(mo);

                        var cacheLogWrite = Core.CacheTo.Get(cacheLogWriteKey) as DateTime?;
                        if (!cacheLogWrite.HasValue)
                        {
                            cacheLogWrite = DateTime.Now;
                        }

                        if (cacheLogs?.Count > cacheLogCount || DateTime.Now.ToTimestamp() - cacheLogWrite.Value.ToTimestamp() > cacheLogTime)
                        {
                            using (var db = new Data.ContextBase())
                            {
                                db.SysLog.AddRange(cacheLogs);
                                db.SaveChanges();
                            }

                            cacheLogs     = null;
                            cacheLogWrite = DateTime.Now;
                        }

                        Core.CacheTo.Set(cacheLogsKey, cacheLogs, 3600 * 24 * 30);
                        Core.CacheTo.Set(cacheLogWriteKey, cacheLogWrite, 3600 * 24 * 30);

                        #endregion
                    }
                    catch (Exception)
                    {
                        //throw new System.Exception("写入操作日志失败");
                    }
                }

                base.OnActionExecuting(context);
            }
예제 #4
0
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                var hc = context.HttpContext;

                //日志记录,设置“__nolog”参数可忽略日志记录,为压力测试等环境考虑(即一些不需要记录请求日志的需求)

                //如果需要记录更详细的日志,可提取请求的参数、表单信息写入日志
                //可能信息量较大,需要考虑分开存储,推荐方案:使用sqlite-net-pcl包按月或按天拆分写入SQLite数据库文件

                if (GlobalTo.GetValue <bool>("logs:enable") && string.IsNullOrWhiteSpace(hc.Request.Query["__nolog"].ToString()))
                {
                    string controller = context.RouteData.Values["controller"].ToString().ToLower();
                    string action     = context.RouteData.Values["action"].ToString().ToLower();
                    string url        = hc.Request.Path.ToString() + hc.Request.QueryString.Value;

                    try
                    {
                        //客户端信息
                        var ct = new Fast.ClientTo(hc);

                        //用户信息
                        var userinfo = Func.Common.GetLoginUserInfo(hc);

                        //日志保存
                        var mo = new Domain.SysLog()
                        {
                            LogId          = Guid.NewGuid().ToString(),
                            SuName         = userinfo.UserName,
                            SuNickname     = userinfo.Nickname,
                            LogAction      = controller + "/" + action,
                            LogUrl         = url,
                            LogIp          = ct.IPv4.Split(',')[0].Trim(),
                            LogCreateTime  = DateTime.Now,
                            LogBrowserName = ct.BrowserName,
                            LogSystemName  = ct.SystemName,
                            LogGroup       = 1
                        };

                        mo.LogContent = DicDescription[mo.LogAction.ToLower()];

                        #region 分批写入日志

                        //分批写入满足的条件:缓存的日志数量
                        int cacheLogCount = GlobalTo.GetValue <int>("logs:batchwritecount");
                        //分批写入满足的条件:缓存的时长,单位秒
                        int cacheLogTime = GlobalTo.GetValue <int>("logs:batchwritetime");

                        //日志记录
                        var cacheLogsKey = "Global_Logs";
                        //上次写入的时间
                        var cacheLogWriteKey = "Global_Logs_Write";

                        if (!(Core.CacheTo.Get(cacheLogsKey) is List <Domain.SysLog> cacheLogs))
                        {
                            cacheLogs = new List <Domain.SysLog>();
                        }
                        cacheLogs.Add(mo);

                        var cacheLogWrite = Core.CacheTo.Get(cacheLogWriteKey) as DateTime?;
                        if (!cacheLogWrite.HasValue)
                        {
                            cacheLogWrite = DateTime.Now;
                        }

                        if (cacheLogs?.Count > cacheLogCount || DateTime.Now.ToTimestamp() - cacheLogWrite.Value.ToTimestamp() > cacheLogTime)
                        {
                            //异步写入日志
                            System.Threading.ThreadPool.QueueUserWorkItem(_ =>
                            {
                                //写入日志前查询IP所属区域
                                var dbpath   = GlobalTo.GetValue("logs:dbpath").Replace("~", GlobalTo.ContentRootPath);
                                using var ds = new IP2Region.DbSearcher(dbpath);

                                foreach (var log in cacheLogs)
                                {
                                    try
                                    {
                                        var ips = log.LogIp.Split(',');
                                        var ipi = new List <string>();

                                        foreach (var ip in ips)
                                        {
                                            //内容格式:国家|区域|省份|市|运营商。无数据默认为0。
                                            var listIpInfo = ds.MemorySearch(ip.Trim().Replace("::1", "127.0.0.1")).Region.Split('|').ToList();

                                            listIpInfo.RemoveAt(1);
                                            listIpInfo = listIpInfo.Where(x => x != "0").Distinct().ToList();

                                            ipi.Add(string.Join(",", listIpInfo));
                                        }

                                        log.LogCity = string.Join(";", ipi);
                                    }
                                    catch (Exception)
                                    {
                                        log.LogCity = "fail";
                                    }
                                }

                                using var db = new Data.ContextBase(Data.ContextBase.DCOB().Options);
                                db.SysLog.AddRange(cacheLogs);
                                db.SaveChanges();

                                //清空数据及更新时间
                                cacheLogs     = null;
                                cacheLogWrite = DateTime.Now;

                                Core.CacheTo.Set(cacheLogsKey, cacheLogs, 3600 * 24 * 30);
                                Core.CacheTo.Set(cacheLogWriteKey, cacheLogWrite, 3600 * 24 * 30);
                            });
                        }
                        else
                        {
                            Core.CacheTo.Set(cacheLogsKey, cacheLogs, 3600 * 24 * 30);
                            Core.CacheTo.Set(cacheLogWriteKey, cacheLogWrite, 3600 * 24 * 30);
                        }

                        #endregion
                    }
                    catch (Exception)
                    {
                        //throw new System.Exception("写入操作日志失败");
                    }
                }

                base.OnActionExecuting(context);
            }
예제 #5
0
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                var    hc         = context.HttpContext;
                string controller = context.RouteData.Values["controller"].ToString().ToLower();
                string action     = context.RouteData.Values["action"].ToString().ToLower();
                var    ca         = "/" + controller + "/" + action;
                string url        = hc.Request.Path.ToString() + hc.Request.QueryString.Value;

                //用户信息
                var userinfo = Application.CommonService.GetLoginUserInfo(hc);

                //角色有权限访问配置的菜单
                if (!Application.CommonService.QueryMenuIsAuth(userinfo.RoleId, ca))
                {
                    context.Result = new ContentResult()
                    {
                        Content    = "unauthorized",
                        StatusCode = 401
                    };
                }

                //日志记录,设置“__nolog”参数可忽略日志记录,为压力测试等环境考虑(即一些不需要记录请求日志的需求)
                if (GlobalTo.GetValue <bool>("logs:enable") && string.IsNullOrWhiteSpace(hc.Request.Query["__nolog"].ToString()))
                {
                    try
                    {
                        //客户端信息
                        var ct = new ClientTo(hc);

                        //日志保存
                        var mo = new Domain.SysLog()
                        {
                            SuName        = userinfo.UserName,
                            SuNickname    = userinfo.Nickname,
                            LogAction     = ca,
                            LogUrl        = url,
                            LogIp         = ct.IPv4,
                            LogUserAgent  = ct.UserAgent,
                            LogCreateTime = DateTime.Now,
                            LogGroup      = 1,
                            LogLevel      = "I"
                        };

                        if (DicDescription.ContainsKey(ca))
                        {
                            mo.LogContent = DicDescription[ca];
                        }

                        #region 分批写入日志

                        CurrentCacheLog.Enqueue(mo);

                        //分批写入满足的条件:缓存的日志数量
                        int cacheLogCount = GlobalTo.GetValue <int>("logs:CacheWriteCount");
                        //分批写入满足的条件:缓存的时长,单位秒
                        int cacheLogTime = GlobalTo.GetValue <int>("logs:CacheWriteSecond");

                        //上次写入的时间
                        var cacheLogWriteKey = "Global_Logs_Write";
                        var cacheLogWrite    = Core.CacheTo.Get(cacheLogWriteKey) as DateTime?;
                        if (!cacheLogWrite.HasValue)
                        {
                            Core.CacheTo.Set(cacheLogWriteKey, cacheLogWrite = DateTime.Now);
                        }

                        if (CurrentCacheLog.Count > cacheLogCount || DateTime.Now.ToTimestamp() - cacheLogWrite.Value.ToTimestamp() > cacheLogTime)
                        {
                            //异步写入日志
                            System.Threading.ThreadPool.QueueUserWorkItem(_ =>
                            {
                                try
                                {
                                    var ipto = new IPAreaTo();

                                    //写入日志前
                                    var listMo = new List <Domain.SysLog>();
                                    while (CurrentCacheLog.Count > 0)
                                    {
                                        var log = CurrentCacheLog.Dequeue();

                                        log.LogId   = Core.UniqueTo.LongId().ToString();
                                        log.LogArea = ipto.Parse(log.LogIp);

                                        var uato           = new UserAgentTo(log.LogUserAgent);
                                        log.LogBrowserName = uato.BrowserName + " " + uato.BrowserVersion;
                                        log.LogSystemName  = uato.SystemName + " " + uato.SystemVersion;
                                        if (uato.IsBot)
                                        {
                                            log.LogGroup = 2;
                                        }

                                        listMo.Add(log);
                                    }

                                    using var db = Data.ContextBaseFactory.CreateDbContext();
                                    db.SysLog.AddRange(listMo);
                                    db.SaveChanges();

                                    //更新时间
                                    Core.CacheTo.Set(cacheLogWriteKey, cacheLogWrite = DateTime.Now);
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("写入日志出错:" + ex.Message);
                                }
                            });
                        }

                        #endregion
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("写入日志出错:" + ex.Message);
                    }
                }

                base.OnActionExecuting(context);
            }
예제 #6
0
파일: FilterConfigs.cs 프로젝트: Quttia/np
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                var hc = context.HttpContext;

                //日志记录,设置“__nolog”参数可忽略日志记录,为压力测试等环境考虑(即一些不需要记录请求日志的需求)

                if (GlobalTo.GetValue <bool>("logs:enable") && string.IsNullOrWhiteSpace(hc.Request.Query["__nolog"].ToString()))
                {
                    string controller = context.RouteData.Values["controller"].ToString().ToLower();
                    string action     = context.RouteData.Values["action"].ToString().ToLower();
                    string url        = hc.Request.Path.ToString() + hc.Request.QueryString.Value;

                    try
                    {
                        //客户端信息
                        var ct = new Fast.ClientTo(hc);

                        //用户信息
                        var userinfo = Application.CommonService.GetLoginUserInfo(hc);

                        //日志保存
                        var mo = new Domain.SysLog()
                        {
                            SuName        = userinfo.UserName,
                            SuNickname    = userinfo.Nickname,
                            LogAction     = controller + "/" + action,
                            LogUrl        = url,
                            LogIp         = ct.IPv4,
                            LogUserAgent  = ct.UserAgent,
                            LogCreateTime = DateTime.Now,
                            LogGroup      = 1,
                            LogLevel      = "I"
                        };

                        mo.LogContent = DicDescription[mo.LogAction.ToLower()];

                        #region 分批写入日志

                        //分批写入满足的条件:缓存的日志数量
                        int cacheLogCount = GlobalTo.GetValue <int>("logs:CacheWriteCount");
                        //分批写入满足的条件:缓存的时长,单位秒
                        int cacheLogTime = GlobalTo.GetValue <int>("logs:CacheWriteSecond");

                        //日志记录
                        var cacheLogsKey = "Global_Logs";
                        //上次写入的时间
                        var cacheLogWriteKey = "Global_Logs_Write";

                        if (!(Core.CacheTo.Get(cacheLogsKey) is List <Domain.SysLog> cacheLogs))
                        {
                            cacheLogs = new List <Domain.SysLog>();
                        }
                        cacheLogs.Add(mo);

                        var cacheLogWrite = Core.CacheTo.Get(cacheLogWriteKey) as DateTime?;
                        if (!cacheLogWrite.HasValue)
                        {
                            cacheLogWrite = DateTime.Now;
                        }

                        if (cacheLogs?.Count > cacheLogCount || DateTime.Now.ToTimestamp() - cacheLogWrite.Value.ToTimestamp() > cacheLogTime)
                        {
                            //异步写入日志
                            System.Threading.ThreadPool.QueueUserWorkItem(_ =>
                            {
                                try
                                {
                                    var ipto = new IPAreaTo();
                                    //写入日志前
                                    foreach (var log in cacheLogs)
                                    {
                                        log.LogId   = Core.UniqueTo.LongId().ToString();
                                        log.LogArea = ipto.Parse(log.LogIp);

                                        var uato           = new UserAgentTo(log.LogUserAgent);
                                        log.LogBrowserName = uato.BrowserName + " " + uato.BrowserVersion;
                                        log.LogSystemName  = uato.SystemName + " " + uato.SystemVersion;
                                        if (uato.IsBot)
                                        {
                                            log.LogGroup = 2;
                                        }
                                    }

                                    using var db = new Data.ContextBase(Data.ContextBase.DCOB().Options);
                                    db.SysLog.AddRange(cacheLogs);
                                    db.SaveChanges();

                                    //清空数据及更新时间
                                    cacheLogs     = null;
                                    cacheLogWrite = DateTime.Now;

                                    Core.CacheTo.Set(cacheLogsKey, cacheLogs);
                                    Core.CacheTo.Set(cacheLogWriteKey, cacheLogWrite);
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("写入日志出错:" + ex.Message);
                                }
                            });
                        }
                        else
                        {
                            Core.CacheTo.Set(cacheLogsKey, cacheLogs);
                            Core.CacheTo.Set(cacheLogWriteKey, cacheLogWrite);
                        }

                        #endregion
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("写入日志出错:" + ex.Message);
                    }
                }

                base.OnActionExecuting(context);
            }
예제 #7
0
            public override void OnResultExecuted(ResultExecutedContext context)
            {
                var    hc         = context.HttpContext;
                string controller = context.RouteData.Values["controller"].ToString().ToLower();
                string action     = context.RouteData.Values["action"].ToString().ToLower();
                var    ca         = "/" + controller + "/" + action;
                string url        = hc.Request.Path.ToString() + hc.Request.QueryString.Value;

                //用户信息
                var userinfo = LoginService.GetLoginUserInfo(hc);

                //日志记录,设置“__nolog”参数可忽略日志记录,为压力测试等环境考虑(即一些不需要记录请求日志的需求)
                if (GlobalTo.GetValue <bool>("logs:enable") && string.IsNullOrWhiteSpace(hc.Request.Query["__nolog"].ToString()))
                {
                    try
                    {
                        swAsync.Stop();

                        //客户端信息
                        var ct = new ClientTo(hc);

                        //日志保存
                        var mo = new Domain.SysLog()
                        {
                            SuName        = userinfo.UserName,
                            SuNickname    = userinfo.Nickname,
                            LogAction     = ca,
                            LogUrl        = url,
                            LogIp         = ct.IPv4,
                            LogUserAgent  = ct.UserAgent,
                            LogCreateTime = DateTime.Now,
                            LogGroup      = 1,
                            LogLevel      = "I",
                            LogRemark     = $"请求耗时:{swAsync.ElapsedMilliseconds}毫秒"
                        };

                        if (DicDescription.ContainsKey(ca))
                        {
                            mo.LogContent = DicDescription[ca];
                        }

                        //记录查询SQL
                        var ovm = (context.Result as ObjectResult)?.Value as QueryDataOutputVM;
                        if (ovm != null)
                        {
                            mo.LogContent += Environment.NewLine + ovm.QuerySql;
                        }

                        #region 分批写入日志

                        CurrentCacheLog.Enqueue(mo);

                        //分批写入满足的条件:缓存的日志数量
                        int cacheLogCount = GlobalTo.GetValue <int>("logs:CacheWriteCount");
                        //分批写入满足的条件:缓存的时长,单位秒
                        int cacheLogTime = GlobalTo.GetValue <int>("logs:CacheWriteSecond");

                        //上次写入的时间
                        var cacheLogWriteKey = "Global_Logs_Write";
                        var cacheLogWrite    = Core.CacheTo.Get(cacheLogWriteKey) as DateTime?;
                        if (!cacheLogWrite.HasValue)
                        {
                            Core.CacheTo.Set(cacheLogWriteKey, cacheLogWrite = DateTime.Now);
                        }

                        if (CurrentCacheLog.Count > cacheLogCount || DateTime.Now.ToTimestamp() - cacheLogWrite.Value.ToTimestamp() > cacheLogTime)
                        {
                            //异步写入日志
                            System.Threading.ThreadPool.QueueUserWorkItem(_ =>
                            {
                                try
                                {
                                    var ipto = new IpAreaTo();

                                    //写入日志前
                                    var listMo = new List <Domain.SysLog>();

                                    while (CurrentCacheLog.TryDequeue(out Domain.SysLog deobj))
                                    {
                                        deobj.LogId   = Core.UniqueTo.LongId().ToString();
                                        deobj.LogArea = ipto.Parse(deobj.LogIp);

                                        var uato             = new UserAgentTo(deobj.LogUserAgent);
                                        deobj.LogBrowserName = uato.BrowserName + " " + uato.BrowserVersion;
                                        deobj.LogSystemName  = uato.SystemName + " " + uato.SystemVersion;
                                        if (uato.IsBot)
                                        {
                                            deobj.LogGroup = 2;
                                        }

                                        listMo.Add(deobj);
                                    }

                                    using var db = Data.ContextBaseFactory.CreateDbContext();
                                    db.SysLog.AddRange(listMo);
                                    db.SaveChanges();

                                    //更新时间
                                    Core.CacheTo.Set(cacheLogWriteKey, cacheLogWrite = DateTime.Now);
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("写入日志出错:" + ex.Message);
                                }
                            });
                        }

                        #endregion
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("写入日志出错:" + ex.Message);
                    }
                }

                base.OnResultExecuted(context);
            }
예제 #8
0
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                var hc = context.HttpContext;

                //日志记录,设置“__nolog”参数可忽略日志记录,为压力测试等环境考虑(即一些不需要记录请求日志的需求)

                if (GlobalTo.GetValue <bool>("logs:enable") && string.IsNullOrWhiteSpace(hc.Request.Query["__nolog"].ToString()))
                {
                    string controller = context.RouteData.Values["controller"].ToString().ToLower();
                    string action     = context.RouteData.Values["action"].ToString().ToLower();
                    string url        = hc.Request.Path.ToString() + hc.Request.QueryString.Value;

                    try
                    {
                        //客户端信息
                        var ct = new Fast.ClientTo(hc);

                        //用户信息
                        var userinfo = Application.CommonService.GetLoginUserInfo(hc);

                        //日志保存
                        var mo = new Domain.SysLog()
                        {
                            SuName        = userinfo.UserName,
                            SuNickname    = userinfo.Nickname,
                            LogAction     = controller + "/" + action,
                            LogUrl        = url,
                            LogIp         = ct.IPv4.Split(',')[0].Trim(),
                            LogCreateTime = DateTime.Now,
                            LogGroup      = 1
                        };

                        mo.LogContent = DicDescription[mo.LogAction.ToLower()];

                        #region 分批写入日志

                        //分批写入满足的条件:缓存的日志数量
                        int cacheLogCount = GlobalTo.GetValue <int>("logs:CacheWriteCount");
                        //分批写入满足的条件:缓存的时长,单位秒
                        int cacheLogTime = GlobalTo.GetValue <int>("logs:CacheWriteSecond");

                        //日志记录
                        var cacheLogsKey = "Global_Logs";
                        //上次写入的时间
                        var cacheLogWriteKey = "Global_Logs_Write";

                        if (!(Core.CacheTo.Get(cacheLogsKey) is List <Domain.SysLog> cacheLogs))
                        {
                            cacheLogs = new List <Domain.SysLog>();
                        }
                        cacheLogs.Add(mo);

                        var cacheLogWrite = Core.CacheTo.Get(cacheLogWriteKey) as DateTime?;
                        if (!cacheLogWrite.HasValue)
                        {
                            cacheLogWrite = DateTime.Now;
                        }

                        if (cacheLogs?.Count > cacheLogCount || DateTime.Now.ToTimestamp() - cacheLogWrite.Value.ToTimestamp() > cacheLogTime)
                        {
                            //异步写入日志
                            System.Threading.ThreadPool.QueueUserWorkItem(_ =>
                            {
                                try
                                {
                                    //写入日志前查询IP所属区域
                                    var dbpath = Path.Combine(GlobalTo.GetValue("logs:path").Replace("~", GlobalTo.ContentRootPath), "ip2region.db");
                                    if (File.Exists(dbpath))
                                    {
                                        using var ds = new IP2Region.DbSearcher(dbpath);

                                        foreach (var log in cacheLogs)
                                        {
                                            var ips = log.LogIp.Split(',');
                                            var ipi = new List <string>();

                                            foreach (var ip in ips)
                                            {
                                                //内容格式:国家|区域|省份|市|运营商。无数据默认为0。
                                                var listIpInfo = ds.MemorySearch(ip.Trim().Replace("::1", "127.0.0.1")).Region.Split('|').ToList();

                                                listIpInfo.RemoveAt(1);
                                                listIpInfo = listIpInfo.Where(x => x != "0").Distinct().ToList();

                                                ipi.Add(string.Join(",", listIpInfo));
                                            }

                                            log.LogCity = string.Join(";", ipi);
                                        }
                                    }

                                    //赋值主键(在前面赋值出现主键重复的问题,原因暂不明)
                                    cacheLogs.ForEach(x => x.LogId = Guid.NewGuid().ToString("N"));

                                    using var db = new Data.ContextBase(Data.ContextBase.DCOB().Options);
                                    db.SysLog.AddRange(cacheLogs);
                                    db.SaveChanges();

                                    //清空数据及更新时间
                                    cacheLogs     = null;
                                    cacheLogWrite = DateTime.Now;

                                    Core.CacheTo.Set(cacheLogsKey, cacheLogs);
                                    Core.CacheTo.Set(cacheLogWriteKey, cacheLogWrite);
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("写入日志出错:" + ex.Message);
                                }
                            });
                        }
                        else
                        {
                            Core.CacheTo.Set(cacheLogsKey, cacheLogs);
                            Core.CacheTo.Set(cacheLogWriteKey, cacheLogWrite);
                        }

                        #endregion
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("写入日志出错:" + ex.Message);
                    }
                }

                base.OnActionExecuting(context);
            }