質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

2548閲覧

文字コードの解読方法について

yuki_90453

総合スコア326

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2021/05/21 02:43

編集2021/05/21 04:41

#概要(追記)
AWSのCloudWatch Logsにエラーが出力された際、通知がされるようしたいと考えております。
通知の際に出力された文字が解読出来ず困っています。

#実際のコード

処理コード

TypeScript

1import {CloudWatchLogsEvent} from 'aws-lambda'; 2import zlib from 'zlib' 3 4export const handler=async(event:CloudWatchLogsEvent, context:any)=>{ 5 const payload = Buffer.from(event.awslogs.data, 'base64') 6 zlib.gunzip(payload, function(e, result) { 7 if (e) { 8 context.fail(e); 9 throw new Error(e.message) 10 } else { 11 const parsed = result.toString('ascii') 12 const obj = JSON.parse(parsed) // 失敗します。 13 const message = obj.logEvents.map(({extractedFields}:any) => extractedFields.event).join('\n') 14 console.log(`メッセージ:${message}`) 15 // await postSlack(message) 16 context.succeed(); 17 } 18 }); 19}

インプット

JSON

1{ 2 "awslogs": { 3 "data": "H4sIAAAAAAAAADVQy0rEMBT9l+DS2tzkJk1mN2BHxCe0qOgMkrYZLUzbIY2KiuC4dS0u/Qpx588Mgp9hfG0ul3O459xzbklj+96c2fx6bsmArA/z4elOmmXDjZSsku6qtS7AwLVkIJgGjgGedWcbrruYByY2V308M01Rmbg3TTTqXOpc5w6NL8+j/Zv66OYgPc+20q3fu8w7a5pwyCiDmIo4zJOV7WGeZvmkRF4UzHCcUos4ZTqxVVExVIUx3NoqSPQXRV+6eu7rrh3VM29dTwYnpG6nHZn8OKSXtvXf4C2pq2DEJYTfNWVUJoKBlCiVRi651omgQiRMACIKShVIZMAgCTxCMPN1aMebJgT91hBSydAATVb/W/vLEVERMcgpHyAOBKxxKo/HPjhxgQoiZqiKUIdN4bSMEqUg0QKxBBj7zd3R3th/vr59PD4tF8/LxfvPfFneP4xbcje5+wJbHB2fowEAAA==" 4 } 5}

出力結果

"{\"messageType\":\"DATA_MESSAGE\",\"owner\":\"139621529134\",\"logGroup\":\"/aws/lambda/sam-ForErrorWatch-PziXzVEhSKEK\",\"logStream\":\"2021/05/21/[$LATEST]c43bb2a34f0e44f297edbd248baa3eed\",\"subscriptionFilters\":[\"info\"],\"logEvents\":[{\"id\":\"36162190206752166468943639975055725144450081642121789441\",\"timestamp\":1621568691307,\"message\":\"2021-05-21T03:44:51.306Z\t66435481-2a08-4981-84fc-788179544c11\tINFO\th57e\u000b\u0015c\u0001\u0017c\u0001>c\u0001\u0017c\u0001\u001fc\u0000\u0002\n\"}]}"

上記のmessageの部分を整形して解読したいのですが出来ません。
またこの出力結果はJSON.parseで失敗します、

#備考
この処理コードはAWS公式に載っているコードコピーしてきました。

下記は実際に載っているコードです。

var zlib = require('zlib'); exports.handler = function(input, context) { var payload = Buffer.from(input.awslogs.data, 'base64'); zlib.gunzip(payload, function(e, result) { if (e) { context.fail(e); } else { result = JSON.parse(result.toString('ascii')); console.log("Event Data:", JSON.stringify(result, null, 2)); context.succeed(); } }); };

#質問
元となるLambda関数で日本語でログが出力されようにしています。

console.log('起動しました')

今回はテストなので、このコードが出力されると検知し、通知されるようにしているのですが、日本語でログを出すのが駄目なんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/05/21 02:48 編集

次のようにすれば表示できると思いますが、本当に読める文字列ですか? \u000b など制御コードにしか見えません。 const o = {"event": "INFO\th57e\u000b\u0015c\u0001\u0017c\u0001>c\u0001\u0017c\u0001\u001fc\u0000\u0002\n"}; console.log(o["event"]);
m.ts10806

2021/05/21 02:50

>unicode16で変換しても変換出来ません。 どのように書いたのでしょうか
yuki_90453

2021/05/21 02:52

内容は「INFO 起動しました。」です
Zuishin

2021/05/21 02:55

その内容はどうやって確認し、このデータはどうやって入手しましたか?
yuki_90453

2021/05/21 03:03

AWS CloudWatch Logsのサブスクリプションフィルターを使用して、ログを監視して特定の文字列があればLambdaが起動するようにしています。 テストで、「INFO 起動しました」を出力するようした所、Lambda上で上記のような文字コードで表示されるようになりました。 回答お願い致します
Zuishin

2021/05/21 03:21

既存のエンコーディングの中に、INFO のような半角英文字を通しながら h57e のような半角英文字でマルチバイト文字を表すようなものはありません。 \u は単なるバイナリのテキスト表現です。 どこかでデータが書き換えられているように思うので、これを解読することはあきらめて正しいデータを送るよう設定してください。
quickquip

2021/05/21 03:53 編集

意図は伝わってると思うのですが、食い違いがないかの確認として説明かコードを追加した方がいいと思います。 というのはここに書いてある文字は全部「ASCIIの範囲内」なので、ASCIIと互換があるどんな文字コードでも読めるからです。(つまり直に答えると"ASCIIです"で終わってしまう) もちろん質問の意図は「JSON.parse(この文字列).event をどう扱えばいいか」みたいなことだろうと推測できますが、それは推測でしかなく、質問に明にかいてあるべきです。 それとは別の話として、このelementの部分は「制御コード混じりのASCII」の範囲内なので、 Zuishin さんからのコメントと同感でここから日本語には素直にはならないでしょう。 データを書いている方のコードや、データをやりとりしている手順(プロトコル)などの方面の記載・調査が必要だと思います。
miyabi-sun

2021/05/21 03:51

JSONはUTF-8で記述されるべきなので どうしてこうなったのかで考えると まぁまぁ理解に苦しむ感じ
yuki_90453

2021/05/21 04:09

みなさんコメントありがとうございます。 前後の処理がわかるようになるべき詳しく質問を編集しましたので、ご確認頂けないでしょうか。 何卒、よろしくお願い致します。
Zuishin

2021/05/21 04:25

> const parsed = result.toString('ascii') パッと見えたこれなんじゃないのかな。 なぜ ascii を選んだんだろう。
miyabi-sun

2021/05/21 04:30

> result.toString('ascii') 引数の"ascii"を消して`result.toString()`にしてみてください ASCIIを指定しなきゃいけないって誰の指示(書籍?記事?)だろう?って感じする
yuki_90453

2021/05/21 04:44

Zuishinさん miyabi-sunさん 何度も回答ありがとうございます。AWS公式に載っていたコードです。一応そのコードも追記しておきましうた。 result.toString()で行けました!!!ありがとうございます!!!!
miyabi-sun

2021/05/21 05:29

確認しました。 確かにASCII文字指定書いてありますね。 解決したようで良かったです。 これで一見落着なら、 回答欄に文字列がA→Bに変異する事を確認したという感じで、 記述してクローズしておいてくださいね、自己解決で大丈夫です。
yuki_90453

2021/05/23 03:27

ありがとうございます。
guest

回答1

0

自己解決

修正依頼の部分に詳細が載っていますが、 toString()を空で指定することで問題なく解析する事が出来ました。
皆さんありがとうございました。

投稿2021/05/23 03:29

yuki_90453

総合スコア326

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問