我正在尝试在AWS CloudFormation模板中定义一个指标过滤器,以匹配CloudWatch中的JSON格式的日志事件。 这是日志事件的示例:
contentRecyclerView
这是我当前尝试使用此处文档中提供的示例创建MetricFilter以匹配状态字段的方法:FilterAndPatternSyntax
initializeAdapters
我在CloudFormation中收到“无效的指标筛选器模式”消息。
我尝试过的其他变化均无效:
class ContentFragment : Fragment() {
...
private var savedRecyclerLayoutState: Parcelable? = null
companion object {
@JvmStatic
fun newInstance(contentBundle: Bundle) = ContentFragment().apply {
arguments = contentBundle
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
if (contentRecyclerView != null)
outState.putParcelable(CONTENT_RECYCLER_VIEW_STATE,
contentRecyclerView.layoutManager!!.onSaveInstanceState())
}
override fun onViewStateRestored(savedInstanceState: Bundle?) {
super.onViewStateRestored(savedInstanceState)
if (savedInstanceState != null) {
savedRecyclerLayoutState = savedInstanceState.getParcelable(CONTENT_RECYCLER_VIEW_STATE)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
feedType = ContentFragmentArgs.fromBundle(arguments!!).feedType
analytics = getInstance(FirebaseApp.getInstance()!!.applicationContext)
contentViewModel = ViewModelProviders.of(this).get(ContentViewModel::class.java)
homeViewModel = ViewModelProviders.of(activity!!).get(HomeViewModel::class.java)
contentViewModel.feedType = feedType
if (savedInstanceState == null) homeViewModel.isRealtime.observe(this, Observer { isRealtime: Boolean ->
when (feedType) {
SAVED.name, DISMISSED.name -> initCategorizedContent(feedType, homeViewModel.user.value!!.uid)
}
})
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
analytics.setCurrentScreen(activity!!, feedType, null)
binding = FragmentContentBinding.inflate(inflater, container, false)
binding.setLifecycleOwner(this)
binding.viewmodel = contentViewModel
binding.actionbar.viewmodel = contentViewModel
binding.emptyContent.viewmodel = contentViewModel
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setToolbar()
initializeAdapters()
}
override fun onDestroy() {
moPubAdapter.destroy()
compositeDisposable.dispose()
super.onDestroy()
}
fun setToolbar() {
when (feedType) {
SAVED.name -> {
binding.actionbar.toolbar.savedContentTitle.visibility = View.VISIBLE
}
DISMISSED.name -> {
binding.actionbar.toolbar.title = getString(R.string.dismissed)
(activity as AppCompatActivity).setSupportActionBar(binding.actionbar.toolbar)
(activity as AppCompatActivity).supportActionBar!!.setDisplayHomeAsUpEnabled(true)
}
}
}
fun initMainContent(isRealtime: Boolean) {
contentViewModel.initializeMainContent(isRealtime).observe(viewLifecycleOwner, Observer { status ->
if (status == SUCCESS && homeViewModel.accountType.value == FREE) updateAds(true)
})
}
fun initCategorizedContent(feedType: String, userId: String) {
contentViewModel.initCategorizedContent(feedType, userId)
}
fun updateAds(toLoad: Boolean) {
var toLoad = toLoad
moPubAdapter.loadAds(AD_UNIT_ID)
moPubAdapter.setAdLoadedListener(object : MoPubNativeAdLoadedListener {
override fun onAdRemoved(position: Int) {}
override fun onAdLoaded(position: Int) {
if (toLoad) {
moPubAdapter.notifyDataSetChanged()
toLoad = false
}
}
})
}
private fun initializeAdapters() {
contentRecyclerView.layoutManager = LinearLayoutManager(context)
populateAdapterType()
observeContentUpdated()
...
}
private fun observeContentUpdated() {
when (feedType) {
MAIN.name -> {
contentViewModel.getMainContentList().observe(viewLifecycleOwner, Observer { homeContentList ->
adapter.submitList(homeContentList)
if (homeContentList.isNotEmpty()) {
emptyContent.visibility = GONE
if (savedRecyclerLayoutState != null) {
contentRecyclerView.layoutManager?.onRestoreInstanceState(savedRecyclerLayoutState)
savedRecyclerLayoutState = null
}
}
})
}
SAVED.name, DISMISSED.name -> {
contentViewModel.getCategorizedContentList(
if (feedType == SAVED.name) SAVED
else if (feedType == DISMISSED.name) DISMISSED
else NONE
).observe(viewLifecycleOwner, Observer { contentList ->
adapter.submitList(contentList)
if (!(contentList.size == 0 && (adapter.itemCount == 1 || adapter.itemCount == 0))) {
emptyContent.visibility = GONE
if (feedType == SAVED.name) {
if (savedRecyclerLayoutState != null) {
contentRecyclerView.layoutManager?.onRestoreInstanceState(savedRecyclerLayoutState)
savedRecyclerLayoutState = null
}
}
if (feedType == DISMISSED.name)
contentRecyclerView.layoutManager?.onRestoreInstanceState(savedRecyclerLayoutState)
}
})
}
}
}
private fun populateAdapterType() {
adapter = ContentAdapter(contentViewModel)
// FREE
if (homeViewModel.accountType.value!! == FREE) {
moPubAdapter = MoPubRecyclerAdapter(activity!!, adapter,
MoPubNativeAdPositioning.MoPubServerPositioning())
...
contentRecyclerView.adapter = moPubAdapter
// Realtime, only need to set ads once.
if (feedType == SAVED.name || feedType == DISMISSED.name) moPubAdapter.loadAds(AD_UNIT_ID)
} /* PAID */ else contentRecyclerView.adapter = adapter
ItemTouchHelper(homeViewModel).build(context!!, FREE, feedType, adapter, moPubAdapter, fragmentManager!!)
.attachToRecyclerView(contentRecyclerView)
}
...
}
我已经能够使用以类似方式定义的方括号表示法成功筛选出空格分隔的日志事件,但是json格式的日志事件并不遵循相同的约定。
答案 0 :(得分:1)
遇到相同的问题,并通过用aws-cdk写几行代码来生成过滤器模式模板,以查看该问题与我所拥有的区别,从而弄清楚了这一点。
似乎需要用括号括起来的每条条件。
package pbt.util.Video
不幸的是,CloudFormation中用于MetricFilter的AWS文档没有JSON模式的示例。