サービスデータ処理をログに記録します:クイックスタート(SLB戦闘ログ処理)

背景

ここで例えばLogstoreにおけるゲートウェイデータ(アリクラウドSLBを記録)、データが処理され、その中に不合理Logstoreに配布されます。

データ

ソースlogstore(SLB-ログ)データコンテンツSLB aliyun Webログで次のように、フォーマットの例を示します。

__source__:  log_service
__tag__:__receive_time__:  1559799897
__topic__:  
body_bytes_sent:  740
client_ip:  1.2.3.4
host:  m.abcd.com
http_host:  m.abcd.com
http_referer:  -
http_x_forwarded_for:  -
http_x_real_ip:  -
read_request_time:  0
request_length:  0
request_method:  GET
request_time:  0.000
request_uri:  /category/abc/product_id?id=75&type=2&sam=123
scheme:  https
server_protocol:  HTTP/2.0
slb_vport:  443
slbid:  lb-1234
ssl_cipher:  ECDHE-RSA-AES128-GCM-SHA256
ssl_protocol:  TLSv1.2
status:  200
tcpinfo_rtt:  58775
time:  2019-06-06T13:44:50+08:00
upstream_addr:  1.2.3.4:80
upstream_response_time:  4.1234
upstream_status:  200
vip_addr:  1.2.3.4
write_response_time: 4.1234

目標

ここでは、データを以下の3つのデータ処理を得ることを期待します:

配布

  1. すべての要求2XX状態または非3XXは、コピー対象のはlogstoreしますslb-log-error、180日間のログ時間を、さらに行うために、研究開発およびセキュリティクラス分析を、__topic__設定しますslb_error
  2. リクエストログのすべての重要度の低い画像やターゲットLogStoreに配布静的リソースは、:slb-log-media、30日間保存されたログ、話題セットslb_media_request
  3. その他、さらに統計分析ドッキング操作の要求ログ、LogStoreをターゲットに配布:slb-log-normal、ログは90日間保持され、話題セットslb_normal

変更

  1. オンslb_media_requestリクエスト
  • 次のフィールドを抽出
object_file=app.icon
object_type = icon   # css, jpeg, js 等
  • 予約済み次のフィールド:
http_referer:  -
body_bytes_sent:  740
client_ip:  1.2.3.4
host:  m.abcd.com
request_time:  4.33
  1. slb_normalリクエスト
  • 予約済み次のフィールド
body_bytes_sent:  740
client_ip:  1.2.3.4
host:  m.abcd.com
http_referer:  -
http_x_real_ip:  -
request_length:  0
request_method:  GET
request_time:  4.33
request_uri:  /category/abc/product_id?id=75&type=2&sam=123
scheme:  https
slb_vport:  443
slbid:  lb-1234
status:  200
time:  2019-06-06T13:44:50+08:00
  • REQUEST_URI抽出されたパラメータは、接頭辞reqparam_
reqparam_id: 75
reqparam_type: 2
reqparam_sam: 123
  • http_x_real_ipそれが空である場合、または-ときフィルclient_ip
  • 抽出hostドメイン値の:
domain:  abcd

準備

ターゲットは準備ができてlogstore

  1. 以下の3 logstoreを作成
slb-log-normal  # 日志保存90天,逻辑命名定为target0
slb-log-error    # 日志保存180天,逻辑命名定为target1
slb-log-media  # 日志保存30天, 逻辑命名定位target2
  1. そして、設定された各指標の
    [指標]設定の[クエリ]ページの各logstoreと各ログlogstoreストレージフィールドをクリックすると、適切なインデックスを設定します。また、使用することができるCLI CloudShellをcopy_logstoreの宛先にコピー元インデックスlogstoreからサブコマンド、および、操作を簡素化するために調整しました。

権限のキー準備

現在の運転許可がターゲットlogstoreソースlogstoreを読み書きするために必要です

  • 認証キーAK
  • 役割の承認により、(フェーズIIをサポートします)

あなたは、一つ以上(各logstore用)AK秘密鍵の訪問を準備する必要があります。

logstoreの最小RAM認可ソース

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "log:ListShards",
        "log:GetCursorOrData",
        "log:GetConsumerGroupCheckPoint",
        "log:UpdateConsumerGroup",
        "log:ConsumerGroupHeartBeat",
        "log:ConsumerGroupUpdateCheckPoint",
        "log:ListConsumerGroup",
        "log:CreateConsumerGroup"
      ],
      "Resource": [
        "acs:log:*:*:project/源project/logstore/slb-log",
    "acs:log:*:*:project/源project/logstore/slb-log/*"
      ],
      "Effect": "Allow"
    }
  ]
}

ターゲットlogstore下のRAMの承認のほとんどは

{
  "Statement": [
    {
      "Action": [
        "log:Post*"
      ],
      "Effect": "Allow",
      "Resource": [ "acs:log:*:*:project/目标Project/logstore/slb-log-error", "acs:log:*:*:project/目标Project/logstore/slb-log-media", "acs:log:*:*:project/目标Project/logstore/slb-log-normal"]
    }
  ],
  "Version": "1"
}

二人はまた、一つの操作に結合許可を簡単にするために考慮することができます。

コンフィギュレーション処理タスク

インタフェース処理ルールを入力します。

  1. ログリストサービスでは、ソースlogstore(SLB-ログ)[処理]を選択

画像

  1. インタラクティブ処理インタフェースを入力します
    例えば、#1に日付と時刻を選択し、[今日]、データを見ることができることを確実にするために:

画像

コピーはSBL-ログエラーをログに記録する要求に失敗しました

以下の編集ボックスのルールでは(命令のための構文は、後続のセクションを参照してください):

TRANSFORM_ANY_1 = {"status": r"4\d+|5\d+" }, COUTPUT(name='target1', topic="slb_error")
DROP_EVENT_1 = ANY 

そして、それはAK秘密鍵のソースlogstoreにアクセスするためのプロンプトがポップアップ表示されます、[プレビュー]のデータをクリックして最初の準備を入力し、
画像

その後、あなたはデータ処理で見ることができ、[タブ]の結果は、すべての非2XX / 3XXはに出力されます要求しtarget1、目標、およびtopicの設定slb_error
画像

静的抽出要求SBL-LOG-メディアへのログクラスと出力

構文についてルールの編集ボックスに次のルールを(更新、以降のセクションを参照してください。

#TRANSFORM_ANY_1 = {"status": r"4\d+|5\d+" }, COUTPUT(name='target1', topic="slb_error")

SET_EVENT_object_file = regex(v("request_uri"), r"/([\.\w]+\.\w+)(?:\?.+|$)?", gi=0)
SET_EVENT_object_type = regex(v("object_file"), r"^[\w\.]+\.(\w+)$", gi=0)

TRANSFORM_EVENT_2 = NO_EMPTY("object_file"), 
            [ KEEP_F([F_META, r"object_\w+|request_uri|client_ip|host|request_time" ]),
                 OUTPUT(name="target2", topic="slb_media_request"),
              ]
  
DROP_EVENT_1 = ANY 

後に、結果がデータ処理[タブ]に見ることができ、要求が静的クラスに出力され、プレビューデータ[クリック]をtarget2前述のニーズに記載されているように、特定のフィールドを抽出し、さらに新たなれる、オブジェクト2によって、フィールドobject_file、およびobject_typetopicに配置されましたslb_media_request
画像

アダプテーションフィールドとSBL-対数正規ログインするための通常の要求を出力します

手順については、更新規則(構文とエディットボックスに次のセクションを参照してください。

#TRANSFORM_ANY_1 = {"status": r"4\d+|5\d+" }, COUTPUT(name='target1', topic="slb_error")

#SET_EVENT_object_file = regex(v("request_uri"), r"/([\.\w]+\.\w+)(?:\?.+|$)?", gi=0)
#SET_EVENT_object_type = regex(v("object_file"), r"^[\w\.]+\.(\w+)$", gi=0)

#TRANSFORM_EVENT_2 = NO_EMPTY("object_file"), 
#            [ KEEP_F([F_META, r"object_\w+|request_uri|client_ip|host|request_time" ]),
#                 OUTPUT(name="target2", topic="slb_media_request"),
#             ]

SET_EVENT___topic__ = 'slb_normal'
EXTRACT_EVENT_request_uri = KV(prefix="reqparam_")
SET_EVENT_http_x_real_ip = op_if(op_eq(v("http_x_real_ip"), '-'), v("client_ip"), v("http_x_real_ip")

KEEP_FIELDS_1 = [F_META, r"body_bytes_sent|client_ip|host|http_referer|http_x_real_ip|request_length",
                         "request_method|request_time|request_uri|scheme|slb_vport|slbid|status"]

#DROP_EVENT_1 = ANY 

[クリック]プレビューデータは、後に、結果がデータ処理[タブ]に見ることができる、メディア出力以外の要求target0先に説明したようにターゲット、特定のフィールドを抽出し、フィールドが必要http_x_real_ipですセットは非なった-値、およびtopic順序で設定しますslb_normal
画像

設定の保存

最终加工规则
在确认规则正确后,去掉注释的部分,就是完整版本:

TRANSFORM_ANY_1 = {"status": r"4\d+|5\d+" }, COUTPUT(name='target1', topic="slb_error")

SET_EVENT_object_file = regex(v("request_uri"), r"/([\.\w]+\.\w+)(?:\?.+|$)?", gi=0)
SET_EVENT_object_type = regex(v("object_file"), r"^[\w\.]+\.(\w+)$", gi=0)

TRANSFORM_EVENT_2 = NO_EMPTY("object_file"), 
            [ KEEP_F([F_META, r"object_\w+|request_uri|client_ip|host|request_time" ]),
                 OUTPUT(name="target2", topic="slb_media_request"),
             ]

SET_EVENT___topic__ = 'slb_normal'
EXTRACT_EVENT_request_uri = KV(prefix="reqparam_")
SET_EVENT_http_x_real_ip = op_if(op_eq(v("http_x_real_ip"), '-'), v("client_ip"), v("http_x_real_ip")

KEEP_FIELDS_1 = [F_META, r"body_bytes_sent|client_ip|host|http_referer|http_x_real_ip|request_length",
                         "request_method|request_time|request_uri|scheme|slb_vport|slbid|status"]

配置目标

点击【保存加工配置】,在配置中,依据前面的需求,配置源logstore的秘钥(预览的时候已经配置了),以及3个目标logstore的Project名、logstore名和写入的AK秘钥。注意3个目标的逻辑名称需要与规则中应用的规则保持一致。

画像

配置加工范围
在加工范围中,可以根据情况选择【所有】、【某个时间开始】或者特定范围,这里选择【某个时间开始】,并选择此刻。那么保存后,新写入源logstore的数据将会自动应用规则写入到配置的3个目标去。
画像

加工任务管理与监控

任务管理

点击日志服务项目页面的左侧导航栏中的【数据加工】,可以看到保存的加工任务,可以根据情况选择修改、停止、重启等操作。
画像

状态洞察

对于数据加工的状态,可以点击以上的【规则洞察】,可以看到当前任务的执行状态,以及错误信息,以便调整:
画像
画像

语法详细说明

第一次预览操作

规则

TRANSFORM_ANY_1 = {"status": r"4\d+|5\d+" }, COUTPUT(name='target1', topic="slb_error")
DROP_EVENT_1 = ANY 

说明

  1. 这里的规则TRANSFORM_ANY_1 = 条件, 操作
  • Python语法中,字符串前面用r修饰,可以避免写两个\的麻烦。
  • 操作:COUTPUT(name='target1', topic="slb_error") 表示复制一份数据并输出到目标target1中,并且将topic设置为slb_error
  1. 规则DROP_EVENT_1 = ANY表示丢弃所有剩余的日志;这里是为了预览的效果特意加上,实际保存的配置中不会有这句话。

第二次预览操作

规则

#TRANSFORM_ANY_1 = {"status": r"4\d+|5\d+" }, COUTPUT(name='target1', topic="slb_error")

SET_EVENT_object_file = regex(v("request_uri"), r"/([\.\w]+\.\w+)(?:\?.+|$)?", gi=0)
SET_EVENT_object_type = regex(v("object_file"), r"^[\w\.]+\.(\w+)$", gi=0)

TRANSFORM_EVENT_2 = NO_EMPTY("object_file"), 
            [ KEEP_F([F_META, r"object_\w+|request_uri|client_ip|host|request_time" ]),
                 OUTPUT(name="target2", topic="slb_media_request"),
             ]

DROP_EVENT_1 = ANY 

详细说明

  1. SET_EVENT_字段名表示设置一个新字段,使用后面的表达式函数的返回值:从字段request_uri中提取了字段object_file,然后进一步提取了object_type,如果object_file不存在,字段object_type也不会存在。
  2. TRANSFORM_EVENT_2 = 条件, [操作1, 操作2]フィールドが示すためのobject_fileない空のイベントを、特定のフィールドを保持していない、とに出力するためにtarget2、その後の処理は、もはやです。
  3. ステップの最初の行のルールはPythonの構文の通り使用し#、コメントアウトを最後の行の保持DROP_EVENT_1 = ANY目的は、プレビューを容易にすることです。

第三のプレビュー動作

ルール

#TRANSFORM_ANY_1 = {"status": r"4\d+|5\d+" }, COUTPUT(name='target1', topic="slb_error")

#SET_EVENT_object_file = regex(v("request_uri"), r"/([\.\w]+\.\w+)(?:\?.+|$)?", gi=0)
#SET_EVENT_object_type = regex(v("object_file"), r"^[\w\.]+\.(\w+)$", gi=0)

#TRANSFORM_EVENT_2 = NO_EMPTY("object_file"), 
#            [ KEEP_F([F_META, r"object_\w+|request_uri|client_ip|host|request_time" ]),
#                 OUTPUT(name="target2", topic="slb_media_request"),
 #            ]

SET_EVENT___topic__ = 'slb_normal'
EXTRACT_EVENT_request_uri = KV(prefix="reqparam_")
SET_EVENT_http_x_real_ip = op_if(op_eq(v("http_x_real_ip"), '-'), v("client_ip"), v("http_x_real_ip")

KEEP_FIELDS_1 = [F_META, r"body_bytes_sent|client_ip|host|http_referer|http_x_real_ip|request_length",
                         "request_method|request_time|request_uri|scheme|slb_vport|slbid|status"]

細部

  1. ここではデフォルトのイベントを設定します__topic__
  2. 使用するEXTRACT_EVENT_字段名 = 字段类操作フィールドのために、request_uriされている値KV操作、前記キーの自動抽出とイベント中に入れました。
  3. さらに式関数に基づくフィールドの設定http_x_real_ip値を。最後に、特定のフィールドを保持しています。
  4. デフォルトが使用されていないOUTPUTデフォルトが目標出力設定に最初のイベントとなりますので、その上およびtarget0インチ
  5. Pythonの構文の方法使用する前に、2つのステップをルール#フォローアップのプレビューが復元されます見ないようにするために、コメントアウトを。

さらに参照して

ようこそスキャンコードは、直接タイムリーとアリクラウドエンジニアにリアルタイムの更新をサポートする公式のネイルグループ(11775223)に参加するには:
画像

おすすめ

転載: yq.aliyun.com/articles/704936