ABAP Netweaver和Cloud Foundry上的环境变量Environment Variable
Netweaver
更准确的说应该是系统变量:结构体sy
设一个断点,调试器里看这些字段的值就能知道每个字段是用来做什么的。
- sy-dbsys
- sy-sysid
- sy-opsys
- sy-saprl
- sy-tcode
Cloud Foundry
环境变量一览表在Cloud Foundry官网
- CF_INSTANCE_ADDR
- CF_INSTANCE_GUID
- CF_INSTANCE_INDEX
- CF_INSTANCE_IP
- CF_INSTANCE_INTERNAL_IP
- CF_INSTANCE_PORT
- CF_INSTANCE_PORTS
- DATABASE_URL
- HOME
- LANG
- MEMORY_LIMIT
- PORT
- PWD
- TMPDIR
- USER
- VCAP_APP_PORT
- VCAP_APPLICATION
- VCAP_SERVICES
当使用cf push往Cloud Foundry上部署应用时,某些环境变量会自动被系统设置,逻辑如同ABAP的sy-sysid自动被设置为当前系统ID一样。
比如app router会把用户访问请求重定向到XSUAA实例上。
app router在manifest.yml里定义的XSUAA实例 xsuaa-jerry-demo,
在运行时会被系统自动写入环境变量VCAP_SERVICES里面:
如何在ABAP Netweaver和CloudFoundry里记录并查看日志
Netweaver
要记录日志需要有一个checkpoint group,可以自行创建也可以使用标准的。这里我重用标准的group:DEMO_CHECKPOINT_GROUP。
tcode SAAB,点Display <->Activate进入编辑模式,将Logpoints设置为"Log",日期设为Today,意为当天生效。
Netweaver的日志记录大多是基于用户级别的,这一点比较方便。给想打开日志记录的用户创建一个打开日志开关的配置:
新建一个report名称为ZCONTEXT, 下面代码的含义是把当前report名称(包含在环境变量sy-cprog)和当前report的运行环境(online运行还是offline运行)写入该checkpoint group。因为可能有其他人也会使用该group,所以用SUBKEY区分不同的用户。
LOG-POINT ID demo_checkpoint_group
SUBKEY sy-uname
FIELDS sy-batch sy-cprog.
执行完report后返回SAAB即可查看到记录的日志。
双击能看到记录的明细。
CloudFoundry
总的guideline在SAP官方Github上有。
这里简述要点。
SAP云平台的CloudFoundry环境里的日志记录推荐使用slf4j(Simple Log Facade for Java)。即Java代码里使用slf4j提供的接口进行日志记录,而具体的日志记录实现可以通过配置文件来指定。
我做了一个例子,全部源代码在我的github上。
我的例子使用log4j2作为日志记录的实现。
(1) 在Java项目的pom.xml里定义slf4j和log4j2的版本号。
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<cf-logging-version>2.1.5</cf-logging-version>
<log4j2.version>2.8.2</log4j2.version>
<slf4j.version>1.7.24</slf4j.version>
</properties>
在pom.xml文件的dependency区域维护相关的dependency:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>com.sap.hcp.cf.logging</groupId>
<artifactId>cf-java-logging-support-log4j2</artifactId>
<version>${cf-logging-version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>com.sap.hcp.cf.logging</groupId>
<artifactId>cf-java-logging-support-servlet</artifactId>
<version>${cf-logging-version}</version>
</dependency>
(2) 在CLASSPATH下新建log4j2.xml, 使用如下源代码:
<Configuration status="warn" strict="true"
packages="com.sap.hcp.cf.log4j2.converter,com.sap.hcp.cf.log4j2.layout">
<Appenders>
<Console name="STDOUT-JSON" target="SYSTEM_OUT" follow="true">
<JsonPatternLayout charset="utf-8" />
</Console>
<Console name="STDOUT" target="SYSTEM_OUT" follow="true">
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} [%mdc] - %msg%n" />
</Console>
</Appenders>
<Loggers>
<!-- Jerry: Log level: INFO -->
<Root level="${LOG_ROOT_LEVEL:-INFO}">
<AppenderRef ref="STDOUT-JSON" />
</Root>
<Logger name="com.sap.hcp.cf" level="${LOG_HCP_CF_LEVEL:-INFO}" />
</Loggers>
</Configuration>
(3) 在SAP云平台Cockpit里创建一个新的log instance:
取名为jerry-log:
(4) 代码里的使用:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger LOGGER = LoggerFactory.getLogger(ConnectivityServlet.class);
然后使用LOGGER.info 记录日志。
(5) 如何查询记录的日志:
点击Logs标签页->Open Kibanna Dashboard, 能看到上图"Diablo Connecting to backend system"对应的日志:
在log明细里能看到之前在SAP云平台Cockpit里创建的Log service实例。
- 点赞
- 收藏
- 关注作者
评论(0)