阿里云服务器地域怎么选 云产品目的地配置不存在?


Aliyun Log Logback Appender
Logback是由log4j创始人设计的又一个开源日志组件。通过使用Logback,您可以控制日志信息输送的目的地是控制台、文件、GUI 组件、甚至是套接口服务器、NT 的事件记录器、 UNIX Syslog
守护进程等;您也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,您能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
通过Aliyun Log Logback Appender,您可以控制日志的输出目的地为阿里云日志服务,写到日志服务中的日志的样式如下:
123456789
level: ERRORlocation: com.aliyun.openservices.log.logback.example.LogbackAppenderExample.main(LogbackAppenderExample.java:18)message: error logthrowable: java.lang.RuntimeException: xxxthread: maintime: 2018-01-02T03:15+0000log: 2018-01-02 11:15:29,682 ERROR [main] com.aliyun.openservices.log.logback.example.LogbackAppenderExample: error log__source__: xxx__topic__: yyy
其中:
level 日志级别。
location 日志打印语句的代码位置。
message 日志内容。
throwable 日志异常信息(只有记录了异常信息,这个字段才会出现)。
thread 线程名称。
time 日志打印时间(可以通过 timeFormat 或 timeZone 配置 time 字段呈现的格式和时区)。
log 自定义日志格式(只有设置了 encoder,这个字段才会出现)。
__source__ 日志来源,用户可在配置文件中指定。
__topic__ 日志主题,用户可在配置文件中指定。
功能优势
日志不落盘:产生数据实时通过网络发给服务端。
无需改造:对已使用logback应用,只需简单配置即可采集。
异步高吞吐:高并发设计,后台异步发送,适合高并发写入。
上下文查询:服务端除了通过关键词检索外,给定日志能够精确还原原始日志文件上下文日志信息。
版本支持:
123
logback 1.2.3log-loghub-producer 0.1.13protobuf-java 2.5.0
配置步骤
maven 工程中引入依赖
12345678910
<dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>2.5.0</version></dependency><dependency><groupId>com.aliyun.openservices</groupId><artifactId>aliyun-log-logback-appender</artifactId><version>0.1.13</version></dependency>
修改配置文件以xml型配置文件logback.xml为例(不存在则在项目根目录创建),配置Loghub相关的appender与 Logger,例如:
12345678910111213141516171819202122232425262728293031323334353637383940
<!--为了防止进程退出时,内存中的数据丢失,请加上此选项--><shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/><appender name="aliyun" class="com.aliyun.openservices.log.logback.LoghubAppender"><!--必选项--><!-- 账号及网络配置 --><endpoint>your project endpoint</endpoint><accessKeyId>your accesskey id</accessKeyId><accessKey>your accesskey</accessKey><!-- sls 项目配置 --><projectName>your project</projectName><logstore>your logstore</logstore><!--必选项 (end)--><!-- 可选项 --><topic>your topic</topic><source>your source</source><!-- 可选项 详见 '参数说明'--><packageTimeoutInMS>3000</packageTimeoutInMS><logsCountPerPackage>4096</logsCountPerPackage><logsBytesPerPackage>3145728</logsBytesPerPackage><memPoolSizeInByte>104857600</memPoolSizeInByte><retryTimes>3</retryTimes><maxIOThreadSizeInPool>8</maxIOThreadSizeInPool><!-- 可选项 通过配置 encoder 的 pattern 自定义 log 的格式 --><encoder><pattern>%d %-5level [%thread] %logger{0}: %msg</pattern></encoder><!-- 可选项 设置 time 字段呈现的格式 --><timeFormat>yyyy-MM-dd'T'HH:mmZ</timeFormat><!-- 可选项 设置 time 字段呈现的时区 --><timeZone>UTC</timeZone></appender><!-- 可用来获取StatusManager中的状态<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/>
-->
注意:
为了防止进程退出时,LoghubAppender缓存在内存中的少量数据丢失,请记得加上DelayingShutdownHook标签。
LoghubAppender在运行过程中产生的异常会被捕获并放入logback的BasicStatusManager类中,您可以通过配置OnConsoleStatusListener或其他方式查看出错信息。参阅:https://logback.qos.ch/access.html
参数说明
Aliyun Log Logback Appender 可供配置的属性(参数)如下,其中注释为必选参数的是必须填写的,可选参数在不填写的情况下,使用默认值。
1234567891011121314151617181920212223242526272829303132333435
#日志服务的 project 名,必选参数projectName = [your project]#日志服务的 logstore 名,必选参数logstore = [your logstore]#日志服务的 HTTP 地址,必选参数endpoint = [your project endpoint]#用户身份标识,必选参数accessKeyId = [your accesskey id]accessKey = [your accesskey]#被缓存起来的日志的发送超时时间,如果缓存超时,则会被立即发送,单位是毫秒,默认值为3000,最小值为10,可选参数packageTimeoutInMS = 3000#每个缓存的日志包中包含日志数量的最大值,不能超过 4096,可选参数logsCountPerPackage = 4096#每个缓存的日志包的大小的上限,不能超过 3MB,单位是字节,可选参数logsBytesPerPackage = 3145728#Appender 实例可以使用的内存的上限,单位是字节,默认是 100MB,可选参数memPoolSizeInByte = 1048576000#指定I/O线程池最大线程数量,主要用于发送数据到日志服务,默认是8,可选参数maxIOThreadSizeInPool = 8#指定发送失败时重试的次数,如果超过该值,会把失败信息记录到logback的StatusManager里,默认是3,可选参数retryTimes = 3#指定日志主题,默认为 "",可选参数topic = [your topic]#指的日志来源,默认为应用程序所在宿主机的 IP,可选参数source = [your source]#输出到日志服务的时间的格式,默认是 yyyy-MM-dd'T'HH:mmZ,可选参数timeFormat = yyyy-MM-dd'T'HH:mmZ#输出到日志服务的时间的时区,默认是 UTC,可选参数(如果希望 time 字段的时区为东八区,可将该值设定为 Asia/Shanghai)timeZone = UTC参阅:https://github.com/aliyun/aliyun-log-producer-java
使用实例
项目中提供了一个名为com.aliyun.openservices.log.logback.LogbackAppenderExample的实例,它会加载resources目录下的logback.xml文件进行logback配置。
logback.xml样例说明
配置了三个appender:loghubAppender1、loghubAppender2、STDOUT。
loghubAppender1:将日志输出到project=test-proj,logstore=store1。输出WARN、ERROR级别的日志。
loghubAppender2:将日志输出到project=test-proj,logstore=store2。只输出INFO级别的日志。
STDOUT:将日志输出到控制台。由于没有对日志级别进行过滤,会输出root中配置的日志级及以上的所有日志。
LogbackAppenderExample.java:
123456789101112131415161718192021
package com.aliyun.openservices.log.logback.example;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/*** Created by brucewu on 2018/1/8.*/public class LogbackAppenderExample {private static final Logger LOGGER = LoggerFactory.getLogger(LogbackAppenderExample.class);public static void main(String[] args) {LOGGER.trace("trace log");LOGGER.debug("debug log");LOGGER.info("info log");LOGGER.warn("warn log");LOGGER.error("error log");}}
logback-example.xml:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
<configuration><!--为了防止进程退出时,内存中的数据丢失,请加上此选项--><shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/><appender name="loghubAppender1" class="com.aliyun.openservices.log.logback.LoghubAppender"><!--必选项--><!-- 账号及网络配置 --><endpoint></endpoint><accessKeyId></accessKeyId><accessKey></accessKey><!-- sls 项目配置 --><projectName>test-proj</projectName><logstore>store1</logstore><!--必选项 (end)--><!-- 可选项 --><topic>topic1</topic><source>source1</source><!-- 可选项 详见 '参数说明'--><packageTimeoutInMS>3000</packageTimeoutInMS><logsCountPerPackage>4096</logsCountPerPackage><logsBytesPerPackage>3145728</logsBytesPerPackage><memPoolSizeInByte>104857600</memPoolSizeInByte><retryTimes>3</retryTimes><maxIOThreadSizeInPool>8</maxIOThreadSizeInPool><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><!-- 打印WARN,ERROR级别的日志 --><level>WARN</level></filter></appender><appender name="loghubAppender2" class="com.aliyun.openservices.log.logback.LoghubAppender"><!--必选项--><!-- 账号及网络配置 --><endpoint></endpoint><accessKeyId></accessKeyId><accessKey></accessKey><!-- sls 项目配置 --><projectName>test-proj</projectName><logstore>store2</logstore><!--必选项 (end)--><!-- 可选项 --><topic>topic2</topic><source>source2</source><!-- 可选项 详见 '参数说明'--><packageTimeoutInMS>3000</packageTimeoutInMS><logsCountPerPackage>4096</logsCountPerPackage><logsBytesPerPackage>3145728</logsBytesPerPackage><memPoolSizeInByte>104857600</memPoolSizeInByte><retryTimes>3</retryTimes><maxIOThreadSizeInPool>8</maxIOThreadSizeInPool><!-- 可选项 通过配置 encoder 的 pattern 自定义 log 的格式 --><encoder><pattern>%d %-5level [%thread] %logger{0}: %msg</pattern></encoder><!-- 可选项 设置时间格式 --><timeFormat>yyyy-MM-dd'T'HH:mmZ</timeFormat><!-- 可选项 设置时区 --><timeZone>Asia/Shanghai</timeZone><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印INFO级别的日志 --><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoderby default --><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg</pattern></encoder></appender><!-- 可用来获取StatusManager中的状态 --><statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/><root><level value="DEBUG"/><appender-ref ref="loghubAppender1"/><appender-ref ref="loghubAppender2"/><appender-ref ref="STDOUT"/></root></configuration>
错误诊断
如果您发现数据没有写入日志服务,可通过如下步骤进行错误诊断。
检查配置文件 logback.xml 是否限定了 appender 只输出特定级别的日志。比如,是否设置了 root 或 logger 的 level 属性,是否在 appender 中设置了 filter。
检查您项目中引入的 protobuf-java,aliyun-log-logback-appender 这两个 jar 包的版本是否和文档中maven 工程中引入依赖部分列出的 jar 包版本一致。
通过观察控制台的输出来诊断您的问题。Aliyun Log Logback Appender 会将 appender 运行过程中产生的异常写入 ch.qos.logback.core.BasicStatusManager 中。您可以通过配置 statusListener 来获取 BasicStatusManager 中的数据。例如, 会将
BasicStatusManager 中的数据输出到控制台。
请检查您的 logback.xml 中是否包含选项 。数据会定期异步地发往服务端,加上此选项可以保证您的程序在正常退出时,内存中缓存的数据不丢失。
常见问题
Q:是否支持自定义 log 格式?
A:在 0.1.12 及以上版本新增了 log 字段。您可以通过在 encoder 中设置 pattern 来自定义 log 格式,例如:
123
<encoder><pattern>%d %-5level [%thread] %logger{0}: %msg</pattern></encoder>
log 输出样例:log: 2018-07-15 21:12:29,682 INFO [main] TestAppender: info message.
Q:日志中为何没有 time 字段?
A:0.1.6 以及之前的版本的 LogItem 没有包含 time 字段,请升级至最新版本。
Q:用户可以自定义 source 字段的取值吗?
A:0.1.8 以及之前的版本不支持,在这些版本中 source 字段会被设置成应用程序所在宿主机的 IP。在最新的版本中,您可以参考上面的配置文件指定 source 的取值。
Q: 如何采集宿主机 IP?
A: 不要在 logback.xml 中设置 source 字段的值,这种情况下 source 字段会被设置成应用程序所在宿主机的 IP。
Q:在网络发生异常的情况下,aliyun-log-logback-appender 会如何处理待发送的日志?
A:aliyun-log-logback-appender 底层使用 aliyun-log-producer-java 发送数据。producer 会根据您在配置文件中设置的 retryTimes 进行重试,如果超过 retryTimes 次数据仍没有发送成功,会将错误信息输出,并丢弃该条日志。关于如何查看错误输出,可以参考错误诊断部分。
Q:如何关闭某些类输出的日志?
A:通过在 logback.xml 文件中添加 可屏蔽相应包下日志的输出。 例如,当您在 logback.xml 文件中添加如下内容会屏蔽 package 名为 com.aliyun.openservices.log.producer.inner 下所有类的日志输出。
Q:应用初始化时出现这样的信息 A number (N) of logging calls during the initialization phase have been intercepted and are now being replayed. These are subject to the filtering rules of the
underlying logging system.?
A:该信息只会在日志系统初始化阶段产生,并不影响后续日志记录的功能。
当应用首次调用LoggerFactory.getLogger()方法时,日志系统进入初始化流程。初始化流程还未结束,再次调用LoggerFactory.getLogger()方法便会出现上述信息。这时,slf4j 会创建替代记录器(substitute loggers)并返回。在完成初始化后,替代记录器(substitute
loggers)会将日志记录请求委托给合适的 logger。
aliyun-log-logback-appender 的依赖库 aliyun-log-producer-java 也会使用 slf4j 记录日志,所以会出现上述信息。
参阅:https://www.slf4j.org/codes.html#replay
Q:如果想设置 time 字段的时区为东八区或其他时区,该如何指定 timeZone 的取值?
A:当您将 timeZone 指定为 Asia/Shanghai 时,time 字段的时区将为东八区。timeZone 字段可能的取值请参考 java-util-timezone。
贡献者@lionbule @zzboy 对项目作了很大贡献。
感谢 @lionbule @zzboy 的杰出工作。

1.1 样品介绍
在工业、农业物联网布线场景中以MODBUS类型为主,样品提供MODBUS类型传感器硬件和软件快速接入方案,并将传感器数据上传到阿里云物联网平台,在云端table store数据库存储,在datav数据大屏上可视化展示。
样品主要特性
本地支持MODBUS工业控制协议的传感器,有叶面湿度、叶面湿度、土壤含水率、土壤温度、土壤酸碱度、光照、二氧化碳含量、大气压力、PM2.5、PM10、风向、风速、降水量等。
AliOS Things物联网操作系统
阿里云物联网平台
云端table Store数据库数据存储
datav数据大屏实时数据和历史数据可视化展示
应用场景
气象监测
农业大棚监测
MODBUS传感器数据经过下面数据流
MODBUS传感器->AliOS Things(uData)->阿里云物联网平平台->OTS规则引擎->TABLESTORE->DATAV数据大屏
1.2 样品展示
数据大屏地址https://datav.aliyun.com/share/b2eed2f4627cf281022bbb4f23c2b568
2 设备端侧搭建
2.1 环境准备
Developerkit开发板一套
ttl转485
MODBUS传感器
485集线器(非必需)
2.2 设备连接
developerkit开发板上TTL串口RX,TX,GND(白线,灰线,黑线)分别连接转换板的RX,TX,GND。转换板上485 A,B两个端口连接到485集线器A,B端子上(红线,橙线)
传感器的485 A,B端口(黄线和绿线)连接到485集线器上,电源和地(红线和黑线)接到电源接口上。
将developerkit、ttl转485转换板USB供电,传感器和485集线器12V电源供电,至此硬件连线完毕。
2.3 uData传感器框架
AliOS Things提供一套传感器uData框架,将MODBUS传感器抽象驱动节点,通过vfs接口open,read操作。AliOS Things还提供MODBUS协议库,MODBUS传感器驱动调用MODBUS库接口读取传感器数据。
2.4 代码下载和修改
代码托管在github上地址: https://github.com/alibabayf/AliOS_modbus分支weather
git clone https://github.com/alibabayf/AliOS_modbus
git checkout weather
代码编译
aos make [email protected]
2.4.1 传感器驱动
MODBUS传感器驱动添加通过下面配置表修改device/sensor/drv/sensor_drv_conf.h
const modbus_sensor_t modbus_sensors[] = {
{ "KunLunHaiAn", "JHFS-W1", "wind speed", dev_windspeed_path, TAG_DEV_WINDSPD,
SENSOR_OPEN, 0X30, 0x002A, 1, 0, 50 },
{ "KunLunHaiAn", "JHFX-W1", "wind direction", dev_winddirection_path, TAG_DEV_WINDDIR,
SENSOR_OPEN, 0X31, 0x002A, 1, 0, 50 },
{ "KunLunHaiAn", "JHYL-W1", "current precipitation", dev_rainfall_path, TAG_DEV_RAIN,
SENSOR_OPEN, 0X32, 0x0002, 1, 0, 50 },
{ "KunLunHaiAn", "JHYL-W1", "today precipitation", dev_todayrainfall_path, TAG_DEV_TODAYRAIN,
SENSOR_OPEN, 0X32, 0x0001, 1, 0, 50 },
};
modbus_sensor_t 中分别指厂商名,型号,名称,设备节点路径,传感器类型,驱动是否支持,从设备地址,寄存器地址,寄存器数量,是否数据反转,读数据超时时间。大部分参数已经配置好了,需要开发者修改的是用户自己设置的传感器从设备地址和驱动是否支持。本例中以JHFS-W1、JHFX-W1、JHYL-W1这三款传感器为例,可以获取到风速、风向、总降水、当日降水量等数据。
2.4.2 uData service注册
在文件framework/uData/service/service_process.c中注册四类传感器服务
case UDATA_SERVICE_WINDSPD:
ret = udata_std_service_register(type);
break;
case UDATA_SERVICE_WINDDIR:
ret = udata_std_service_register(type);
break;
case UDATA_SERVICE_RAIN:
ret = udata_std_service_register(type);
break;
case UDATA_SERVICE_TODAYRAIN:
ret = udata_std_service_register(type);
break;
2.4.3 四元组修改
修改framework/protocol/linkkit/iotkit/sdk-encap/imports/iot_import_product.h中四元组信息,为云端创建设备后获得
#define PRODUCT_KEY "a1N9KL6USIp"
#define PRODUCT_SECRET
"Voaf7vWI0Ioki4k3GSNP5QeEr8zeJinG"
#define DEVICE_NAME "shanghaiT3"
#define DEVICE_SECRET
"Voaf7vWI0Ioki4k3GSNP5QeEr8zeJinG"
2.4.4 uDataapp-example
文件example/uDataapp/uData-example.c订阅四类传感器数据
ret = uData_subscribe(UDATA_SERVICE_WINDSPD);
ret = uData_subscribe(UDATA_SERVICE_WINDDIR);
ret = uData_subscribe(UDATA_SERVICE_RAIN);
ret = uData_subscribe(UDATA_SERVICE_TODAYRAIN);
example中拿到传感器数据会按照下面json格式发送给云端。{"WINDSPD":xxx,"WINDDIR":xxx,"RAIN":xxx,"TODAYRAIN":xxx}
3 云端配置
3.1 创建产品
阿里云物联网平台创建产品https://cn.aliyun.com/product/iot?spm=5176.cniot.loT.1.40721ba6VeAQwS
在创建的产品中定义新Topic类
3.2 创建设备
生成的三元组信息需要和设备端一致。
3.3 创建规则引擎
3.4 编写规则引擎SQL语句
用于解析topic收到的json payload。
3.5 创建Table Store数据库实例
https://cn.aliyun.com/product/ots?spm=5176.cniot.cloudEssentials.78.19b81ba6dHx6op
3.6 创建Table Store数据表
设置time为主键,为字符串
3.7 编写规则转发数据目的地
> 实例、数据表、主键和 3.5和3.6中创建的实例、数据表、主键对应。
3.8 datav数据大屏添加数据
阿里云数据大屏地址https://data.aliyun.com/visual/datav?spm=5176.7968328.dataTechnology.6.69631232y6lNwp
3.9 创建可视化大屏
左侧提供一些模板供参考
3.10 datav获取数据实例
创建一个仪表盘组件
以风向数据为例,用getRange操作方式指定“direction”从后往前查找,“limit”:1 查找最新的一个数据。将WINDDIR字段值给value
至此就可以实现风向数据实时更新。

我要回帖

更多关于 阿里云服务器地域怎么选 的文章

 

随机推荐