当前位置: 首页 > news >正文

网站模板上传工具怎么才能在百度上打广告

网站模板上传工具,怎么才能在百度上打广告,深圳网络推广深圳网,运动网站建设日志规范 V1.0 适用范围#xff1a;适用于通用服务日志#xff08;如nginx/redis/mysql日志#xff09;之外的所有线上落盘日志#xff0c;包括服务端业务日志#xff0c;BI日志#xff0c;移动端APP日志。 实施范围#xff1a;要求所有新业务模块以及深度重构的模块实…日志规范 V1.0 适用范围适用于通用服务日志如nginx/redis/mysql日志之外的所有线上落盘日志包括服务端业务日志BI日志移动端APP日志。 实施范围要求所有新业务模块以及深度重构的模块实施日志规范鼓励现有业务模块通过日志组件替换或改造来实施标准日志规范 主要设计思路与折衷 引入数据标签DLTAG便于日志分类与提取日志内容使用格式化key/value实现日志特定字段与数据的统一化解析日志格式与BI日志保持兼容双竖线分隔实现所有业务日志规范的统一同时最大程度降低BI日志及处理系统改造的成本引入默认DLTAG_undef与默认key_msg机制无缝兼容老日志改造降低非结构化业务日志的研发成本引入Trace技术融入日志规范要求实现请求数据的跨服务自动关联基于日志数据分析进行系统拓扑刻画 一、 日志基本要求 l 日志基础分类 FATAL: 严重错误日志若出现则代表模块需要退出或者出现重大运行错误**[可选]**ERROR普通错误日志请求处理中出现非预期错误但模块可以继续服务无需退出WARNING: 警告日志[可选] STRACE引入特定日志级别 记录trace信息同时配合采样逻辑。 放在warning和info日志等级间INFO(NOTICE): 系统通知日志不包括单个请求的处理日志例如系统的启动、停止、词表配置重载TRACE: 请求跟踪日志只包括单个请求的处理和通知日志例如请求的入口、出口、外部调用DEBUG: 代码调试日志 l 日志存储与拆分 当前写入的日志名必须固定不允许增加变化的前缀或者后缀日志可以根据量级按小时或者按天切分切分格式建议追加时间后缀如didi.log.2015122310同类日志在所有机器上的部署路径必须保持一致线上服务不允许开启DEBUG级别日志[可选] 日志文件以模块名为前缀以.分隔错误日志以独立文件存储建议拆分为 模块名.log记录INFO/TRACE/DEBUG日志模块名.log.wf记录FATAL/ERROR/WARNING日志 l 日志内容基础要求 单条日志不允许跨多行Java和Python的异常信息除外单条日志最大长度不超过4096待讨论确定否则需要截断日志中所有功能字符必须为英文字符例如冒号、分号、逗号等单条日志必须包含时间字段建议精确到毫秒带有时区格式要求为 yyyy-MM-ddTHH:mm:ss.SSSZ如2015-12-23T15:19:25.0890800 l 不允许记录的日志 数据库除数据库名外的所有连接信息。例数据库IP、数据库用户名、数据库密码用户除用户UID、用户名外的所有用户信息。例用户邮箱、用户密码等第三方接口与第三方接口之间的权限验证等信息。例TOKEN、密钥等 二、 日志格式要求 l 日志内容及格式要求 格式示例 [INFO][2015-12-02T00:00:07.0990800][com/dataapi/handler.DataApi:212] dltag||key1value1||key2value2||key3value3||…… 格式说明 单条日志分为三个部分”固定日志头 数据标签DLTAG||KV字段列表“固定日志头和DLTAG之间用空格( )进行区分、DLTAG和KV列表之间用**双竖线(||)**分隔 固定日志头必须包括三个域[日志级别][时间戳][扩展区域] 且各个域中不允许出现空格 日志级别包括FATALWARNINGSTRACENOTICETRACEDEBUG时间戳格式要求yyyy-MM-ddTHH:mm:ss.SSSZ 带有毫秒带有时区日期与时间通过字母T分隔eg: 2015-12-02T00:00:07.0990800扩展区域用户可以自行定义大部分场景用来打印”代码行/类名/函数名“建议的内部格式为 全路径文件名:行号:类名:函数名(不做细节要求)。 数据标签DLTAG用来标识该条日志记录的内容以及日志中能获得的字段信息与BI日志中的public前缀功能相同一些重要内容摘要如下 业务日志(非BI日志)中的DLTAG必须以下划线_为前缀目的是为了与BI日志的数据标签做区分防止重复公司级的DLTAG统一使用_com_为前缀例如_com_request_in, _com_request_out, _com_http_success每个事业部可以设置自己的DLTAG用来做记录业务相关annotation每个DLTAG都需要有必选和可选的key列表以及value类型描述DLTAG的默认值为_undef没有具体含义的日志或者无需定义专门DLTAG的日志可以使用默认值 KV字段列表 中包含结构化的key与value数据 各个key/value组合以双竖线||分隔key与value之间使用等号链接key/value的字段内容中需要避免出现双竖线key的内容中需要避免出现等号如果出现可以通过日志组件进行自动转义key的默认值为_msg没有具体含义的key可以使用默认值一般搭配_undef的数据标签使用 目前抽取的公共DLTAG列表要求所有模块必须输出这些日志 含义DLTAG基础必选项(注:不可缺少必打出的key)建议可选key备注请求入口_com_request_intraceid spanid uri (当前接口)argscallee的access日志①建议使用uri表达接口名称请求出口_com_request_outtraceid spanid uri (当前接口)proc_timeerrnoresponseerrmsgcallee的access日志①proc_time建议缺省单位s并且缺省单位。 如果不是建议方式至少需要在一个模块内部保持一致。②建议使用uri表达接口名称请求外部thrift接口_com_thrift_success/failuretraceid spanid cspanid uri (当前接口)interface (下游接口)proc_timeerrnohost(远程请求地址)porterrmsgcaller的调用外部thrift接口的日志一般在请求拿到response后记录请求外部http接口_com_http_success/failuretraceidspanidcspaniduri (当前接口) url (下游接口)proc_timeerrnohost(远程请求地址)porterrmsgcaller的调用外部http接口的日志一般在请求拿到response后记录请求外部mysql_com_mysql_success/failuretraceid****spaniduri (当前接口)method_name(select、update等)proc_timeerrnohost(远程请求地址)porttableerrmsgcaller的调用mysql服务的日志一般在请求拿到response后记录请求外部redis_com_redis_success/failuretraceid****spaniduri (当前接口)method_name(set、get等)proc_timeerrnohost(远程请求地址)porterrmsgcaller的调用redis服务的日志一般在请求拿到response后记录远程dubbo请求_com_dubbo_success_com_dubbo_failuretraceidspanidcspaniduri (当前接口) url (下游接口) proc_timeerrnohost(远程请求地址)porterrmsg①url 表达远程接口②uri 表达当前接口若A—B则 url Buri A其他_undef_msgtraceid****spanid**① _undef不属于 _com型通用dltag② 需要与 _com型通用日志配合使用并且正确使用traceid spanid来记录系统行为。 ** l 日志兼容问题 业务日志中会有很多无需kv化的日志多数只输出一个message对于此类日志可以使用默认DLTAG和key来进行兼容 默认DLTAG_undef。默认key为_msg 调整前 [INFO] [2015-12-02 00:00:07.0990800][com/dataapi/handler.DataApi:212] params error. fail over调整后 [INFO] [2015-12-02 00:00:07.0990800][com/dataapi/handler.DataApi:212] _undef||_msgparams error. fail over注意日志格式调整可能会涉及到依赖日志的应用比如odin监控规则的调整。 老模块改造中兼容旧的日志打印接口新的日志组件可以保留老的接口即允许用户不传入DLTAG仍然只传入一个msg但新日志组件会自动将日志打印为如下格式 [INFO] [2015-12-02 00:00:07.0990800][com/dataapi/handler.DataApi:212] _undef||_msgparams error. fail over 三、 trace相关信息 l trace信息 日志记录同时记录相关的trace信息。用来串联跨模块请求的日志。 引入traceid 用来唯一描述一次端到端的请求访问。需要业务代码配合进行trace信息的生成解出传递记录。 生成在APP端上或者nginx服务器生成的uuid。解出在请求进入的时候将请求中的traceid解出。传递在访问外部httpthrift等网络通信请求的时候将traceid植入在请求中传递。记录在请求入口请求出口访问外部httpthrift等网络通信请求的时候将traceid记录进入日志。或者任意一条业务日志记录的时候都将traceid记录 引入spanidcspanid(childSpanid) 。 用来描述一个请求访问一个trace在一个模块内部的唯一标示一个span。需要业务代码配合进行span信息的生成解出传递记录。 – 以下的解释站在callee的角度来描述了请细细体会 生成每个模块被调用方指定spanid如果没有则生成一个spanid解出在请求进入的时候将请求中的cspanid解出作为自己的spanid。传递在访问外部httpthrift等网络请求的时候生成cspanid将cspanid植入在请求中传递。记录在请求入口请求出口记录spanid访问外部httpthrift等网络通信请求的时候将spanidcspanid记录进入日志。 依据语言特性phpjava的日志组件保存在TLS里面可以自动在日志中加入traceid和spanid。其他语言日志组件需要显示传入 一个带有trace信息的日志 [NOTICE][2016-03-28T12:29:20.9990800][line/home/xiaoju/webroot/gulfstream/application/pay/v1/helpers/log_helper.php 442 class? function::log_request] _com_request_in||traceid0af289a156f8b3200e6f5344345e7e02||spanidf4b6a0ec58a4f503||cspanid5df56b99411f4fab||logid408994954500||uri/gulfstream/pay/v1/wxpayinterface/jsSDKSign||url/gulfstream/pay/v1/wxpayinterface/jsSDKSign||from10.242.154.79 用一个图来说明一下dltagtraceidspanid和cspanid在trace链条串联的作用。 这是跨模块调用的trace信息传递的图。 这几条格式化日志是在一次具体的调用中接口dPullOrder调用接口getDriverInfo产生的日志中的几个字段。 ①红框内属于同一个traceid0af2a17358346a0627fd437e199dd102。整个调用输入一个调用栈产生的日志信息traceid在这个调用栈的请求内透传。 ②黄框内是该调用trace在模块1dPullOrder产生的所有日志属于一个spanid62541ca1663d0b9d。在模块1处理这个调用中spanid保持一致。 ③篮框内是该调用trace在模块2getDriverInfo产生的所有日志属于同一个spanid6254ecd55a2c05d2。在模块2处理这个调用中spanid保持一致。 同时模块1dPullOrder调用模块2getDriverInfo的时候产生日志将两个spanid关联在一起构建成62541ca1663d0b9d-6254ecd55a2c05d2的调用关系。 ④绿框内是该调用在模块1产生的业务标注日志可能是错误异常或者业务打点。trace聚合会将他们聚合在一起。 l 收益 系统整体关联图的自动生成监控与定位 单请求功能Trace能力可以索引任何请求相关联的上下游模块处理、外部服务调用协助提供一个请求在各个模块的处理信息、快速查找错误日志单请求性能Trace能力可以生成任意请求在各个调用链模块的耗时信息快速定位性能瓶颈模块接口稳定性DrillDown能力一个接口出现不稳定情况可以进行关联服务的DrillDown分析自动分析关联的下游接口与外部服务稳定性 系统容量预估与监控架构风险、性能分析 四、 [可选] 风险分析 风险分析日志规范如下 key含义dltag_com_http_success、_com_http_failure、_com_thrift_success、_com_thrift_failuretraceidtraceidcaller_func调用方接口callee_func被调用方接口proc_time请求耗时errno错误码errmsg错误信息callee_host被调用方ip 示例 [NOTICE][2018-04-17T11:49:28.2850800][line/home/xiaoju/webroot/gulfstream/application/driver/v2/vendor/disf/spl/src/Trace/Trace.php 641 class“Disf”\SPL\Trace functionDisf\SPL\Trace::afterRpcHook] _com_http_success||traceidxxxxxxxxxxxxxxxxxx||caller_func/xxxxx/xxxxxxxxxxxxx||callee_funchttp://xxx.xxx.xxx.xxx:xxxx/xxx/xxxxxxx||errno0||errmsgxxx||proc_time169||callee_hostxxx.xxx.xxx.xxx 日志样例 [INFO][2023-11-06T19:30:03.4570800][com.xiaoju.manhattan.pay.controller.cashier.OrderController:248] _undef||spanid004180007c4adef8||traceid0aa2ff086548ce38a27c3d2343c6f286||_msg收银台查询订单queryOrderRespDTO:{bankName:农业银行,bankNo:622848*********5610,bizCode:,bizMsg:,closeTime:2023-11-07 17:37:30,createTime:2023-11-06 17:37:30,failCode:,failReason:,merchantId:M0002182,orderAmount:23580,orderNo:DD0004308020231103155626Uebfag,orderStatus:0,payAmount:23580,payChannel:0,payId:23110617373000021820c42ae9183qfX,payInfos:[{bizCode:,bizMsg:,failCode:,failReason:,payAmount:23580,payChannel:0,payElement:{\cardNo\:\uqfn7X*********uzg6/IL8usBwBw4EQ/HUVtP1SM44\},payMethod:200,status:0}],payStatus:0,pmCode:200,productType:CASHIER_PAY}实现思路 应用程序改造 Component Slf4j public class AccessFilter implements Filter {Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {ResponseWrapper responseWrapper new ResponseWrapper((HttpServletResponse)response);RequestWrapper requestWrapper new RequestWrapper((HttpServletRequest) request);// 获取请求路径String path requestWrapper.getRequestURI();String traceId requestWrapper.getHeader(LogTag.traceIdName);String caller requestWrapper.getHeader(LogTag.caller_func);if(traceId null) {traceId UUID.randomUUID().toString().replace(-,);}MDC.put(LogTag.caller_func,caller);MDC.put(LogTag.callee_func,path);MDC.put(LogTag.traceIdName,traceId);MDC.put(LogTag.spanIdName, UUID.randomUUID().toString().replace(-,).substring(0,25));long startTime System.currentTimeMillis();MDC.put(LogTag.dltag,LogTag._com_request_in);log.info(requestWrapper.getRequestBody());try {MDC.put(LogTag.dltag,LogTag._undef);chain.doFilter(requestWrapper, responseWrapper);} finally {String content new String(responseWrapper.getResponseData(), utf-8);ResultMsg resultMsg JSON.parseObject(content, ResultMsg.class);long endTime System.currentTimeMillis();MDC.put(LogTag.proc_time,Long.toString(endTime - startTime));MDC.put(LogTag.errno,Integer.toString(resultMsg.getErrorCode()));MDC.put(LogTag.errmsg,resultMsg.getErrorMsg());MDC.put(LogTag.dltag,LogTag._com_request_out);log.info(content);MDC.clear();response.getWriter().write(content);}}private static class MyPrintWriter extends PrintWriter {public MyPrintWriter(Writer out) {super(out);}Overridepublic String toString() {return super.out.toString();}} }/** 自定义实现日志插件* author weijinhao* date 2023/11/18 22:01*/ Plugin(name Log4jEncodeLayout, category Node.CATEGORY, elementType Layout.ELEMENT_TYPE, printObject true) public class LogPlugin extends AbstractStringLayout {private String formt [level][data][method] [dltag];private PatternLayout patternLayout;private ListString logKey;protected LogPlugin(Charset charset,String pattern) {super(charset);patternLayout PatternLayout.newBuilder().withPattern(pattern).build();logKey new ArrayList();logKey.add(LogTag.traceIdName);logKey.add(LogTag.spanIdName);logKey.add(LogTag.caller_func);logKey.add(LogTag.callee_func);logKey.add(LogTag.errno);logKey.add(LogTag.errmsg);logKey.add(LogTag.proc_time);}protected LogPlugin(Charset aCharset, byte[] header, byte[] footer) {super(aCharset, header, footer);}protected LogPlugin(Configuration config, Charset aCharset, Serializer headerSerializer, Serializer footerSerializer) {super(config, aCharset, headerSerializer, footerSerializer);}Overridepublic String toSerializable(LogEvent event) {String dltag LogTag.dltag;StringBuffer log new StringBuffer();//[%level][%data][%method] %DLTAGfinal StackTraceElement element event.getSource();String logString new String(formt);logString logString.replace(level,event.getLevel().name());Instant instant Instant.ofEpochMilli(event.getInstant().getEpochMillisecond());logString logString.replace(data, instant.toString());logString logString.replace(method,element.toString());ReadOnlyStringMap contextData event.getContextData();MapString, String contextMap contextData.toMap();String dltagContent contextMap.get(dltag);if(dltagContent null) {dltagContent _undef;}logString logString.replace(dltag,dltagContent);log.append(logString);HashMapString, String sortMap new HashMap();sortMap.putAll(contextMap);for (String keyName : logKey) {String value sortMap.get(keyName);String tag || keyName (value null ? : value);log.append(tag);sortMap.remove(keyName);}for (Map.EntryString, String entry : sortMap.entrySet()) {if(!StringUtils.equals(dltag,entry.getKey())) {String key entry.getKey();String value entry.getValue();String tag || key (value null ? : value);log.append(tag);}}String message patternLayout.toSerializable(event);log.append(|| _msg message );return log.toString();}PluginFactorypublic static Layout createLayout(PluginAttribute(value pattern) final String pattern,PluginAttribute(value charset) final Charset charset) {return new LogPlugin(charset,pattern);} }/*** author weijinhao* date 2023/11/18 18:02*/ public class LogTag {public static String dltag dltag;public static String traceIdName traceId;public static String spanIdName spanId;public static String caller_func caller_func;public static String callee_func callee_func;public static String proc_time proc_time;public static String errno errno;public static String errmsg errmsg;public static String _com_request_in _com_request_in;public static String _com_request_out _com_request_out;public static String _undef _undef;public static String _msg _msg; }log4j2.xml配置 ?xml version1.0 encodingUTF-8? !--packages 参数指定插件包路径多个路径用逗号隔开-- Configuration statusINFO nameXMLConfigTest packagecom.log.demo.common.logPropertiesProperty namePATTERN%m%n/Propertyproperty nameMODULE_NAMEdemo/propertyproperty nameLOG_HOME/home/xiaoju/logs/property/PropertiesAppendersConsole nameSTDOUTLog4jEncodeLayout pattern${PATTERN} charsetUTF-8//ConsoleRollingFile nameROLLINGFILE fileName${LOG_HOME}/${MODULE_NAME}.logfilePattern${LOG_HOME}/${MODULE_NAME}-%d{yyyy-MM-dd}-%i.logLog4jEncodeLayout pattern${PATTERN} charsetUTF-8/PoliciesTimeBasedTriggeringPolicy modulatetrueinterval24 /SizeBasedTriggeringPolicy size100MB//PoliciesDefaultRolloverStrategy max100Delete basePath${LOG_HOME} maxDepth3IfFileName glob*/${MODULE_NAME}-*.log/IfLastModified age30d/ !-- 这里保留30天 --/Delete/DefaultRolloverStrategy/RollingFile/AppendersLoggersRoot levelINFOAppenderRef refSTDOUT/AppenderRef refROLLINGFILE//RootLogger namecom.snbc.vems levelINFO additivityfalseAppenderRef refSTDOUT/AppenderRef refROLLINGFILE//LoggerLogger nameorg.apache levelWARN additivityfalse includeLocationfalseAppenderRef refSTDOUT/AppenderRef refROLLINGFILE//LoggerLogger nameorg.mybatis levelWARN additivityfalse includeLocationfalseAppenderRef refSTDOUT/AppenderRef refROLLINGFILE//LoggerLogger nameorg.hibernate levelWARN additivityfalse includeLocationfalseAppenderRef refSTDOUT/AppenderRef refROLLINGFILE//LoggerLogger nameorg.springframework levelWARN additivityfalse includeLocationfalseAppenderRef refSTDOUT/AppenderRef refROLLINGFILE//Logger/Loggers /Configuration 项目git地址: https://gitee.com/weijinhao/log.git 上面我们有了日志的具体格式了我们通过代码也实现了该日志格式。 之后我们就需要使用logstash对日志进行处理之后输出到es中供我们监控. logstash 的学习思路主要有一下几点 logstash 中使用的数据类型 参见:[Structure of a Config File | Logstash Reference 6.1] | Elasticlogstash 中使用的条件表达是 参见 [Accessing Event Data and Fields in the Configuration | Logstash Reference 6.1] | Elastic然后就是 logstash 的input 输入,我们调试可以使用 stdin标准输入在之后就是filter比较常用的filter有dissect分隔符 grovk(正则表达式) date(日期类型转化) mutate(类型或字段修改),等几种表达式最后就是输出了比如es 的 我们调试就使用 stdout 就好了 logstash 的pipeline 配置 # The # character at the beginning of a line indicates a comment. Use # comments to describe your configuration. input {#stdin {}file {path /home/xiaoju/logs/**/*sincedb_path /home/xiaoju/logstash/logstash-6.1.1/data/log1start_position beginningcodec multiline {pattern ^\[charset UTF-8what previousnegate true}} } # The filter part of this file is commented out to indicate that it is # optional. #[INFO][2023-11-20T09:50:44.872Z][com.log.demo.filter.AccessFilter.doFilter(AccessFilter.java:47)] [_com_request_in]||traceIda9d350051e834dd58fc0288caf920365||spanIddcc4e8d0058143e9a898d29ed||callee_func/test||caller_func||_msg{ # [INFO][2023-11-20T09:50:44.349Z][com.log.demo.filter.AccessFilter.doFilter(AccessFilter.java:59)] [_com_request_out]||traceIddbba05f9f404450f927f150f45ac8bc7||spanId5102773f6c884d95800dbc122||errno10000||caller_func||callee_func/test||errmsg##success||proc_time153||_msg{errorCode:10000,errorMsg:success,bizContent:null}filter {dissect {mapping {message [%{level}][%{data}][%{}] [%{action}]||traceId%{traceId}||spanId%{spanId}||caller_func%{caller_func}||callee_func%{callee_func}||errno%{errno}||errmsg%{errmsg}||proc_time%{proc_time}||%{}}}date {match [ data, ISO8601 ]}mutate {convert { errno integerproc_time integer }}}output {#stdout {# codec rubydebug#}elasticsearch {hosts [192.168.88.102:9200,192.168.88.103:9200]index goslin-gateway-log} }这之后我们的数据就到了es中了那我们就可以建立虚拟图之后建立disboard了,当然需要具备一些 es聚合分析相关的语法才能更好的创建图表.
http://www.pierceye.com/news/227546/

相关文章:

  • 惠州做网站乐云seo网站建设如何插音乐
  • 自媒体图片素材网站东莞网站建设推广技巧
  • 新浪网站是什么程序做的六安网站关键词排名优化地址
  • 手机网站大全123456镇江手机网站建设
  • 企业网站模板下载哪家公司强服装设计就业前景如何
  • 婚纱网站源代码网站制作专业的公司
  • 公司经营范围 网站开发网络工程好就业吗
  • 企业网站建设与管理试题wordpress设置页面访问权限
  • 中国顺德手机网站设计安居客做网站
  • 网站运营的含义百度地图轨迹导航
  • 网站开发时创业中文网站模板
  • 男人最爱的做网站网站建设合作合同范文
  • 我和你99谁做的网站做润滑油网站图片
  • 基于wordpress门户网站wordpress可以自己写代码吗
  • 自己做发卡网站wordpress搬家出问题
  • 网站建设数据库搭建秦皇岛市属于哪个省
  • 网站建设怎样找客户辽宁网站定制企业
  • 建设工程项目管理网站上海it公司
  • 网站运营需要 做哪些工作做网站需要了解的知识
  • 旅游去过的地方可做标识网站百度一下网页入口
  • 做ps找图的网站有哪些法与家国建设征文网站
  • 途途外贸企业网站管理系统aspnet网站模板
  • 网站建设企业网站常用参数
  • 深圳市建设工程质量检测网站网站建设公司 待遇
  • 站长工具大全php做在线直播网站
  • 品牌建设网站公司排名3d模型代做网站
  • 保定网站建设模板联系方式网站设计时图片怎么做
  • 网站策划书内容鄂尔多斯网站制作 建设
  • 广州展厅设计公司排名seo快速排名首页
  • 网站命名方式潍坊市建设工程管理处网站