CRMEB多商户系统v2.0
首页
官网
技术社区
开源地址
序言
系统简介
前端脑图
项目介绍
功能清单
更新记录
多商户v2.0.0(20220525)
多商户v2.0.1(20220622)
多商户v2.0.2(20220901)
多商户v2.0.3(20221026)
多商户v2.1.0(20230209)
多商户v2.1.1(20230406)
多商户v2.2(20230626)
多商户v2.2.1(20230914)
多商户v2.2.2(20231114)
安装指南
准备工作
服务器购买
服务器配置
阿里云
腾讯云
京东云
域名配置
域名购买
域名解析
SSL证书
⚠️注意事项
宝塔证书
阿里云证书
腾讯云证书
配置HTTPS
安装搭建
运行环境
1.站点创建
2.环境配置
3.上传源码
4.反向代理
5.守护进程
6.一键安装
视频安装教程
注意事项(很重要)
重启swoole服务
linux安装swoole方法
特别注意事项
mysql 5.7注意事项
基础配置
商城配置
公众号配置
公众号配置
公众号开发配置
公众号菜单
设置公众号菜单
关键字
跳转网页
跳转小程序
上传域名校验证书
小程序配置
公众平台配置
CRMEB后台配置
支付配置
微信V2支付
微信V3支付
支付宝支付
发布小程序
源码打包发行
后台下载发行
确认发布
基础配置完成
新手入门
版本更新
旧版本更新流程
自动更新(1.4及以上版本)
打包H5/公众号
部署多套多商户
技术文档
开发规范
数据字典
目录结构
移动端路由
系统配置
后台表单说明
APP打包
基础配置
开发调试
打包上线
App打包
隐私政策
自定义命令
清除缓存
开启热更新
微信开放平台
容器部署
使用说明
商品管理
虚拟商品
卡密商品
商品分类
平台商品分类
商户商品分类
品牌分类
商品标签
发布商品
商品规格
商品采集
保障服务
移动端商品管理
开启移动端商品管理
功能说明
商品推荐
商品口令
商品参数
价格说明
商品详情
热销排行
分销管理
分销配置
分销员管理
分销规则说明
分销员等级
分销礼包
佣金说明
提现
提现规则
提现步骤
商家到零钱
分销订单
用户管理
用户反馈
商户用户管理
平台用户管理
用户协议
用户搜索记录
账户管理
账号信息
账户资金
订单管理
后台订单
移动端订单
订单退款
订单打印
电子面单v2
客服管理
商家客服
添加客服
自动回复
平台客服
开启客服
自动回复
商户管理
商户入驻
商户列表
商户菜单管理
商户详情
财务管理
财务对账
发票管理
自动分账
店铺管理
开启店铺
店铺信息
店铺类型
店铺保证金
店铺配置
店铺街
店铺活动
门店自提
开启门店自提
设置核销权限
订单核销说明
店铺装修
一号通
一号通注册
电子面单
短信提醒
商品采集
物流查询
社区功能
社区分类
社区话题
社区内容
社区评论
社区配置
小程序配置
1. 小程序下载并提交审核
2. 确认发布
3.小程序直播配置
商城装修
PC端首页
PC端开启
PC端平台页面配置
PC端店铺页面配置
商城装修
主题风格
页面设置
自定义链接
店铺模板
素材管理
同城配送
账号注册
达达
UU
同城配送
消息管理
模板消息
公众号模板消息
小程序订阅消息
消息管理
公告管理
阿里云短信
后台消息
营销活动
秒杀
秒杀规则
开启秒杀活动
直播
主播实名认证
开启直播
添加直播商品
预售
开启全款预售
开启定金预售
预售协议
专题
后台配置
前端展示
助力
开启助力
查看助力活动
拼团
虚拟拼团设置
开启拼团
查看拼团活动
积分
积分设置
积分来源
积分使用
优惠券
商户优惠券
平台优惠券
优惠套餐
商户后台
平台后台
活动氛围图
活动边框图
商城设置
储存管理
基础设置
七牛云
阿里云
腾讯云
华为云
UC存储
京东云
天翼云
运费设置
运费组成
运费模板
物流配置
小票打印
协议与规则
飞鹅云配置
会员管理
等级用户
等级管理
等级权益
等级配置
付费会员
平台后台设置
商户后台设置
积分商城
积分商城设置
积分商品
积分订单
开放接口
账号管理
商户主动退款
商户后台退款
移动端退款
移动端说明
目录结构
配置说明
页面路径
首页无DIY二开说明
后台前端说明
总后台目录结构
商户后台目录结构
开发和构建
PC端说明
安装教程
目录结构
打包教程
PC端SEO安装
常见问题
服务器问题
服务器环境说明
MySQL 5.7注意事项
PHP fileinfo扩展安装
扩展安装不生效如何处理?
如何切换PHP版本
PHP Fatal error: Namespace declaration报错如何解决
多商户安装问题
前后端分离配置
前端代码如何重新上传?
前端源码位置在哪?
小程序直播插件未授权怎么处理?
如何使用IP部署项目?
swoole端口号被占用怎么处理?
报错 NOAUTH Authentication required. 如何解决
语法错误:unexpected 'c' (T_STING)如何处理
【检查php/swoole/swoole_loader版本】的方法
【网站打开乱码】解决办法
多商户使用问题
上传图片不显示如何处理?
如何在宝塔中使用命令行执行命令?
如何修改项目swoole运行端口
swoole 或 queue服务无法启动如何排查
清空数据
后台登录页幻灯片如何修改
后台登录页logo如何设置
个人中心菜单加链接
子账号登录名
如何重启swoole进程
导出文件无法导出如何处理?
搜索商品后服务挂了如何处理
安装完成后台下载小程序报404
商品上/下架用户端商品不起作用
授权失败如何处理
前端代码打包后怎么放到服务器
如何设置跳转链接?
测试域名如何使用?
修改代码如何配置热更新?
进入商户提示没有访问权限如何解决?
多商户平台后台的管理员密码忘了如何处理
客服聊天链接失败如何处理
消息管理同步报错tid does not exit rid 报错如何处理
如何更换加密文件
支付提示当前页面URL链接未注册
小程序打开空白的问题处理
加密文件丢失如何处理
支付宝报错 implode():Passing….】的解决方法
小程序图片不显示或海报不能生成
如何开启Debug
如何查看接口报错信息
登录子商户报没有权限登录,如何解决?
验证码刷新不变
前端打包教程
如何快速找到后台菜单栏
授权失效
输入源"/body/xml/appid"映射到字段公众号..
小程序超包的分包方法
阿里云发送短信 params must be [a-zA-Z0-9] for verification sms
模板不存在:APPLY_MER_SUCCESS
安装过程提示系统错误
提示‘某某读取了你的剪切板内容'
各版本问题汇总
2.0.0及以前版本问题
2.0.1
2.0.2
2.0.3
论坛常见问题汇总
小程序提示插件未授权
开发文档
架构
config配置文件
容器和依赖注入
异常处理
路由
控制器模块
日志处理
自定义指令
预留事件
订单
微信
商品
用户
订单退款
后台管理
种草社区
CRMEB类库
Basic基类
Exceptions异常处理
Interfaces接口类
Jobs消息队列
services服务类
traits
listens定时监听类
接口流程
Controller
Repository
Dao
Model
流程
订单流程
下单流程
退款流程
二开教程
定义新的接口
创建新的页面
创建新的组合数据
更换短信模板
新增模板消息
商业授权
授权说明
申请授权
测试域名
购买版权
日志处理
# 日志处理 ### 日志配置 日志的配置文件是配置文件目录下的`log.php`文件,系统在进行日志写入之前会读取该配置文件进行初始化 ``` return [ // 默认日志记录通道 'default' => 'file', // 日志记录级别 'level' => [], // 日志类型记录的通道 ['error'=>'email',...] 'type_channel' => [], // 日志通道列表 'channels' => [ 'file' => [ // 日志记录方式 'type' => 'File', // 日志保存目录 'path' => '', // 单文件日志写入 'single' => false, // 独立日志级别 'apart_level' => [], // 最大日志文件数量 'max_files' => 0, ], // 其它日志通道配置 ], ]; ``` 可以添加多个日志通道,每个通道可以设置不同的日志类型。日志配置参数根据不同的日志类型有所区别,内置的日志类型包括:`file`,日志类型使用`type`参数配置即可。 > 如果是自定义驱动,`type`的值则为自定义驱动的类名(包含命名空间) 日志全局配置参数: | 参数 | 描述 | | --- | --- | | default | 默认的日志通道 | | level | 允许记录的日志级别 | | type_channel | 日志类型记录的通道 | > 默认的日志类型是`File`方式,可以通过驱动的方式来扩展支持更多的记录方式。 文件类型日志的话,还支持下列配置参数: | 参数 | 描述 | | --- | --- | | path | 日志存储路径 | | file_size | 日志文件大小限制(超出会生成多个文件) | | apart_level | 独立记录的日志级别 | | time_format | 时间记录格式 | | single | 是否单一文件日志 | | max_files | 最大日志文件数(超过自动清理 ) | | format | 日志输出格式 | | realtime_write | 是否实时写入 | > 为了避免同一个目录下面的日志文件过多的性能问题,日志文件会自动生成日期子目录。 ### 日志写入 一般日志是自动写入的,手动写入日志使用这两个方法 >record 方法(记录日志信息到内存) ``` Log::record('日志信息'); //默认日志级别是info,也可以手动指定 Log::record('这是一条警告日志','notice'); ``` >write方法(实时记录) ``` Log::write('测试日志信息,这是警告级别,并且实时写入','notice'); ``` 配置文件中开启实时写入 ``` // 实时写入 'realtime_write' => true, ``` ### 关闭日志 ``` Log::close(); ``` ### 日志级别 日志的级别从低到高依次为:`debug`,`info`,`notice`,`warning`,`error`,`critical`,`alert`,`emergency`,ThinkPHP额外增加了一个`sql`日志级别仅用于记录`SQL`日志(并且仅当开启数据库调试模式有效) > 系统发生异常后记录的日志级别是`error` ``` Log::error('错误信息'); Log::info('日志信息'); ``` 提供助手函数 ``` trace('错误信息', 'error'); trace('日志信息', 'info'); ``` >默认情况下是不会记录HTTP异常日志(避免受一些攻击的影响写入大量日志),除非你接管了系统的异常处理,重写了`report`方法 ### 日志上下文 日志可以传入上下文信息(数组),并且被替换到日志内容中 ``` Log::info('日志信息{user}',['user'=>'张三']); ``` ### 独立日志 为了便于分析,`File`类型的日志还支持设置某些级别的日志信息单独文件记录: ``` return [ 'default' => 'file', 'channels' => [ 'file' => [ 'type' => 'file', // error和sql日志单独记录 'apart_level' => ['error','sql'], ], ], ]; ``` 设置后,就会单独生成`error`和`sql`两个类型的日志文件,主日志文件中将不再包含这两个级别的日志信息 > 如果`apart_level`设置为`true`,则表示所有的日志类型都会独立记录 ### 单文件日志 默认情况下,日志是按照日期为目录,按天为文件生成的,但如果希望仅生成单个文件(方便其它的工具或者服务读取以及分析日志) ``` return [ 'default' => 'file', 'channels' => [ 'file' => [ 'type' => 'file', 'single' => true, 'file_size' => 1024*1024*10, ], ], ]; ``` 开启生成单个文件后,`file_size`和`apart_level`参数依然有效,超过文件大小限制后,系统会自动生成备份日志文件。 默认的单文件日志名是`single.log`,如果需要更改日志文件名,可以设置 ``` return [ 'default' => 'file', 'channels' => [ 'file' => [ 'type' => 'file', 'single' => 'single_file', 'file_size' => 1024*1024*10, ], ], ]; ``` 那么实际生成的日志文件名是`single_file.log`,如果设置了`apart_level`的话,可能还会生成`single_file_error.log`之类的日志 > 单文件日志也支持`max_files`参数设置,因为单文件日志同样会生成多个日志备份文件而导致日志文件数据过大 ### 写入处理 日志支持写入回调处理,通过事件的方式处理。 ``` Event::listen('think\event\LogWrite', function($event) { if('file' == $event->channel) { $event->log['info'][] = 'test info'; } }); ``` ### 格式化日志信息 系统提供了两个参数用于日志信息的格式化,第一个是用于自定义时间显示格式的`time_format`,第二个是调整日志输出格式的`format`参数 ``` return [ 'default' => 'file', 'channels' => [ 'file' => [ 'type' => 'file', 'json' => true 'file_size' => 1024*1024*10, 'time_format' => 'Y-m-d H:i:s', 'format' => '[%s][%s]:%s', ], ], ]; ``` ### 清空日志 一旦执行`save`方法后,内存中的日志信息就会被自动清空,如果需要手动清空可以使用: ``` Log::clear(); ``` 在清空日志方法之前,你可以使用`getLog`方法获取内存中的日志。 ``` // 获取全部日志 $logs = Log::getLog(); ``` > 日志清空仅仅是清空内存中的日志。 ### 日志自动清理 文件类型的日志支持自动清理。可以设置`max_files`参数,超过数量的最早日志将会自动删除。 ``` return [ 'default' => 'file', 'channels' => [ 'file' => [ 'type' => 'file', 'max_files' => 30, 'file_size' => 1024*1024*10, ], ], ]; ``` > 设置`max_files`参数后,日志文件将不会分日期子目录存放。 ### JSON格式日志 可以支持`JSON`格式记录文件日志,更加方便一些第三方日志分析工具进行日志分析。 ``` return [ 'default' => 'file', 'channels' => [ 'file' => [ 'type' => 'file', 'json' => true 'file_size' => 1024*1024*10, ], ], ]; ``` 即可开启`JSON`格式记录,CLI命令行的日志记录同样有效。 使用JSON格式记录后,每次请求是一行JSON数据,但如果使用`Log::write`记录的日志是例外的单独一行JSON数据。 ### 日志通道 你可以配置不同的日志通道,并且把不同的日志记录到不同的通道。 ``` Log::channel('email')->info('一条测试日志'); Log::channel('socket')->error('记录错误日志'); ``` 你可以配置不同的日志类型,记录到不同的日志通道,这样在记录日志的时候会自动选择对应的通道写入。 ``` return [ 'default' => 'file', 'type_channel' => [ 'error' => 'email', 'sql' => 'sql', ], 'channels' => [ 'file' => [ 'type' => 'file', ], 'email' => [ 'type' => 'email', ], 'sql' => [ 'type' => 'sql', ], ], ]; ``` 表示如果是`error`日志和`sql`日志,会分别记录到指定的通道。同时你还需要在日志配置文件中,添加`email`和`sql`日志通道的配置。核心只有`file`日志类型,其它的可能需要自己扩展或者安装扩展。 如果需要获取内存中的通道日志信息,可以使用 ``` // 获取某个日志通道的日志 $error = Log::getLog('file'); ``` 可以单独关闭某个通道的日志写入,只需要把日志通道的`close`配置参数设置为`true`,或者使用方法关闭。 ``` Log::close('file'); ``` 可以单独清空某个通道的日志(如果没有开启实时写入的话) ``` Log::clear('file'); ``` ### 自定义驱动 如果需要自定义日志驱动,你需要实现`think\contract\LogHandlerInterface`接口。 ``` interface LogHandlerInterface { /** * 日志写入接口 * @access public * @param array $log 日志信息 * @return bool */ public function save(array $log): bool; } ```
本页目录